Django 博客教程修改中的 NoReverseMatch 错误
我刚刚完成了一个Django博客的教程,链接在这里:博客教程
现在我想添加一个功能,来统计每篇博客文章的浏览次数。为此,我在views.py文件中添加了以下内容(注意,教程中views.py是完全空的,因为它使用了Django的通用视图):
def detail_view(request, object_id):
object = Post.objects.filter(id=object_id)
object.update(counter = F('counter') + 1)
return render_to_response('posts/post_detail.html', {'object':object}, context_instance=RequestContext(request))
我不太确定我这样写render_to_response是否正确。我的urls.py现在是:
from models import Post
queryset = {'queryset': Post.objects.order_by('-pub_date')}
urlpatterns = patterns('',
url('^$', 'django.views.generic.list_detail.object_list', queryset, name="posts"),
url('^(?P<object_id>\d+)/$', 'posts.views.detail_view', name="post")
我的post_list.html文件中有以下代码,用来创建一个指向post_detail.html的链接:
<a href={% url post object.id %}>{{ object.title }}</a>
而且完整的错误信息是:
> Exception Value:
Caught NoReverseMatch while rendering: Reverse for 'post' with arguments '('',)' and keyword arguments '{}' not found.
Traceback:
> Environment:
Request Method: GET
Request URL: localhost:8000/1/
Django Version: 1.3
Python Version: 2.6.1
Installed Applications:
['django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.comments',
'django.contrib.admin',
'Blog.posts',
'Blog.categories']
Installed Middleware:
('django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.middleware.csrf.CsrfResponseMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware')
Template error:
In template /Users/kevin/PycharmProjects/Blog/templates/posts/_post.html, error at line 3
Caught NoReverseMatch while rendering: Reverse for 'post' with arguments '('',)' and keyword arguments '{}' not found.
1 : <div id=”object_{{ object.id }}”>
2 : <h2>
3 : <a href= {% url post object.id %} >{{ object.title }}</a>
4 : <small>{{ object.pub_date|timesince }} ago</small>
5 : </h2>
6 : {{ object.body }}
7 : </div>
Traceback:
File "/Library/Python/2.6/site-packages/django/core/handlers/base.py" in get_response
111. response = callback(request, *callback_args, **callback_kwargs)
File "/Users/kevin/PycharmProjects/Blog/posts/views.py" in detail_view
12. return render_to_response('posts/post_detail.html', {'object':object}, context_instance=RequestContext(request))
File "/Library/Python/2.6/site-packages/django/shortcuts/__init__.py" in render_to_response
20. return HttpResponse(loader.render_to_string(*args, **kwargs), **httpresponse_kwargs)
File "/Library/Python/2.6/site-packages/django/template/loader.py" in render_to_string
188. return t.render(context_instance)
File "/Library/Python/2.6/site-packages/django/template/base.py" in render
123. return self._render(context)
File "/Library/Python/2.6/site-packages/django/template/base.py" in _render
117. return self.nodelist.render(context)
File "/Library/Python/2.6/site-packages/django/template/base.py" in render
744. bits.append(self.render_node(node, context))
File "/Library/Python/2.6/site-packages/django/template/debug.py" in render_node
73. result = node.render(context)
File "/Library/Python/2.6/site-packages/django/template/loader_tags.py" in render
127. return compiled_parent._render(context)
File "/Library/Python/2.6/site-packages/django/template/base.py" in _render
117. return self.nodelist.render(context)
File "/Library/Python/2.6/site-packages/django/template/base.py" in render
744. bits.append(self.render_node(node, context))
File "/Library/Python/2.6/site-packages/django/template/debug.py" in render_node
73. result = node.render(context)
File "/Library/Python/2.6/site-packages/django/template/loader_tags.py" in render
64. result = block.nodelist.render(context)
File "/Library/Python/2.6/site-packages/django/template/base.py" in render
744. bits.append(self.render_node(node, context))
File "/Library/Python/2.6/site-packages/django/template/debug.py" in render_node
73. result = node.render(context)
File "/Library/Python/2.6/site-packages/django/template/loader_tags.py" in render
159. return self.render_template(self.template, context)
File "/Library/Python/2.6/site-packages/django/template/loader_tags.py" in render_template
141. output = template.render(context)
File "/Library/Python/2.6/site-packages/django/template/base.py" in render
123. return self._render(context)
File "/Library/Python/2.6/site-packages/django/template/base.py" in _render
117. return self.nodelist.render(context)
File "/Library/Python/2.6/site-packages/django/template/base.py" in render
744. bits.append(self.render_node(node, context))
File "/Library/Python/2.6/site-packages/django/template/debug.py" in render_node
73. result = node.render(context)
File "/Library/Python/2.6/site-packages/django/template/defaulttags.py" in render
450. raise e
Exception Type: TemplateSyntaxError at /1/
Exception Value: Caught NoReverseMatch while rendering: Reverse for 'post' with arguments '('',)' and keyword arguments '{}' not found.
我已经花了几个小时试图找出问题所在,但仍然没有找到答案。我在SO.com上也看了很多相关内容,但还是没有运气。
非常感谢你的帮助。
谢谢!
1 个回答
0
试试这个:
<a href="{% url post object_id=object.id %}">{{ object.title }}</a>
你需要给参数起个名字,这样反向操作才会顺利。另外,你还应该把网址用引号括起来。
附注:如果你的网址输入是这样的:
url('^(\d+)/$', 'posts.views.detail_view', name="post")
那么你原来的代码是可以工作的,但这不是推荐的做法。
另外,看起来你应该在你的 render_to_response
调用中这样做:
... , {'object':object[0]}, ...
因为 filter
只是返回一个修改过的查询集,这样在 update
中是没问题的,但在你的模板里你把它当成一个对象来处理,所以在放到上下文中时,你应该把它解析成一个对象。