2017-07-16 88 views
0

我正在试图在浏览器上运行与django的博客版本。而我得到这个错误:运行Django时,'Reverse'是什么意思?

NoReverseMatch at/ 
Reverse for 'blog.views.post_detail' not found. 
'blog.views.post_detail' is not a valid view function or pattern name. 

url.py我的应用程序的样子:

from django.conf.urls import include, url 
from . import views 

urlpatterns = [ 
    url(r'^$', views.post_list), 
    url(r'^post/(?P<pk>[0-9]+)/$', views.post_detail), 
] 

看来,当我键入127.0.0.1:8000/
该网址将指向views.post_list
而我views.py样子:

from django.shortcuts import render, get_object_or_404 
from .models import Post 

def post_list(request): 
    posts = Post.objects.filter(published_date__isnull=False) 
    return render(request, 'blog/post_list.html', {'posts': posts} 

def post_detail(request, pk): 
    post = get_object_or_404(Post, pk=pk) 
    return render(request, 'blog/post_detail.html', {'post': post}) 

post_list()将呈现与post_list.html请求。
里面post_list.html,错误来自行:

<h1><a href="{% url 'blog.views.post_detail' pk=post.pk %}">{{ post.title }}</a></h1> 

我真的不明白“反向”是指在错误消息。 'blog.views.post_detail'确实存在于views.py。我想我得到了代码所需的一切,但无法弄清楚哪里出了问题。

我是新来的django,抱歉,如果问题是基本的,谢谢回答!

+0

也许看看[此帖](https://开头stackoverflow.com/questions/43453368/noreversematch-at-product-pussyes-reverse-for-basket-adding-not-found-bask) – PRMoureu

+0

你在哪里定义你想链接到的post_detail的URL? –

回答

0

Django 1.10删除了通过视图的虚线导入路径反转URL的功能。相反,你需要命名URL模式,并使用该名称扭转网址:

urlpatterns = [ 
    url(r'^$', views.post_list, name='post-list'), 
    url(r'^(?P<pk>\d+)/$', views.post_detail, name='post-detail'), 
] 

而且在你的模板:

<h1><a href="{% url 'post-detail' pk=post.pk %}">{{ post.title }}</a></h1> 
+0

它的工作原理,谢谢。但是,“逆向”是做什么的? – Zhemy

+0

@Zhemy查看[反向解析网址](https://docs.djangoproject.com/en/1.11/topics/http/urls/#reverse-resolution-of-urls)。 'url'模板标签调用'reverse()'。 – knbk

+0

Okey我看到了,非常感谢! – Zhemy

0

看来你的urls.py应该如下:

from django.conf.urls import include, url 
from . import views 

urlpatterns = [ 
    url(r'^$', views.post_list), 
    url(r'^(?P<pk>\d+)/$', views.post_detail), 
] 
+0

对不起,我的代码中有第二行url(),但我认为这里并不重要,并且删除它。 – Zhemy

0

你应该为你的网址定义名称:

urlpatterns [ 
    url(r'^$', views.post_list,name=post_list), 
] 

然后使用URL标记是这样的:

<a href="{% url 'AppName:post_list' %}"></a> 

AppName是你的Django应用程序名称。

+0

它说“'博客'不是已注册的命名空间”,我可以在哪里查看我的命名空间?名称空间实际上代表了什么? – Zhemy

+0

您是否在django设置文件中添加了您的应用程序INSTALLED_APPS = []? – pooya

+0

此外,您还必须将您的应用添加到您的djago项目的urls.py文件(而不是您的应用中的urls.py) – pooya