【问题标题】:Django NoReverseMatch Error in blog tutorial modification博客教程修改中的Django NoReverseMatch错误
【发布时间】:2011-04-11 04:33:13
【问题描述】:

我刚刚完成了这里的 Django 博客教程:Blog tutorial

我现在正在尝试添加一项功能,该功能将计算博客文章收到的查看次数。为此,我在 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 上读过很多东西,但还是没有运气。

非常感谢您的帮助。

谢谢!

【问题讨论】:

  • 我刚刚检查了管理员,发现计数器确实有效。所以至少已经完成了这么多。

标签: python django


【解决方案1】:

试试:

<a href="{% url post object_id=object.id %}">{{ object.title }}</a>

您需要提供参数的名称才能使反向操作愉快。此外,您应该引用 URL。

附:如果您的 URL 条目是:

url('^(\d+)/$', 'posts.views.detail_view', name="post")

但这不是推荐的方法。

另外,看起来你应该这样做:

... , {'object':object[0]}, ...

在您的render_to_response 电话中。 filter 只返回一个修改后的查询集,它可以与 update 一起正常工作,但在您的模板中您将其视为一个对象,因此您应该在将其放入上下文时将其解析为一个对象。

【讨论】:

  • 感谢您的回复!我使用了您的代码&lt;a href="{% url post object_id=object.id%}"&gt;{{ object.title }}&lt;/a&gt;,但这仍然不起作用。错误现在也是Exception Value: Caught NoReverseMatch while rendering: Reverse for 'post' with arguments '()' and keyword arguments '{'object_id': ''}' not found.,我应该将最后一段代码 object[0] 放在哪里?
  • 澄清了我对您的第二点的回答。您现在遇到的错误是 URL 的 object_id 部分在 url() 中声明为 \d+,这意味着一个或多个数字,但 object.id 解析为一个空字符串。我认为这是因为object 是一个查询集而不是一个对象,但如果objectNone,它也可能发生...
  • 将我的 render_to_response 更改为 return render_to_response('posts/post_detail.html', {'object':object[0]}, context_instance=RequestContext(request)) 并且成功了!我认为错误信息非常具有误导性。看起来问题与 urls.py 中的 post="name" 没有任何关系,这就是错误消息的样子。非常感谢!希望这对某人也有帮助。
  • 当您看到该错误消息时,几乎总是意味着相反的参数错误。它无法真正分辨出球掉在了哪里。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-02
  • 1970-01-01
  • 2015-06-15
  • 1970-01-01
  • 2016-01-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多