% url % 给我 NoReverseMatch 错误,而 reverse() 返回 url 就好了。为啥?
Posted
技术标签:
【中文标题】% url % 给我 NoReverseMatch 错误,而 reverse() 返回 url 就好了。为啥?【英文标题】:% url % gives me NoReverseMatch error while reverse() returns the url just fine. Why?% url % 给我 NoReverseMatch 错误,而 reverse() 返回 url 就好了。为什么? 【发布时间】:2012-05-08 16:35:46 【问题描述】:我不知道这个SO question 是否与我将要描述的问题相同,但它确实具有相同的症状。不幸的是,在我写这篇文章的时候,它仍然没有解决。
所以这是我的问题。我正在尝试将 James Bennett 的 django-registration app 添加到我的 django 项目中。我已经完成了根据我的需要配置它 - 自定义模板和 url。就在我认为一切都很好的时候。在 django-registration 所需的自定义模板之一中使用% url 'testing' item_id=123 %
时出现NoReverseMatch
错误(我也尝试使用视图名称myapp.views.test
,但没有成功)。有趣的是,我在 shell 中尝试了reverse('testing', kwargs='item_id':123)
,并且返回的 url 很好。我以为% url %
在后端使用reverse()
但为什么我得到不同的结果?
urls.py:(我网站的 URLconf)
urlpatterns = patterns('myapp.views',
url(r'^test/(?P<item_id>\d+)/$', 'test', name='testing'),
)
activation_email.txt: (上述模板。请注意,它是 django-registration 要求的有意在 .txt 扩展名中的,这不应该是问题的原因.)
% comment %Used to generate the body of the activation email.% endcomment %
Welcome to site ! Please activate your account by clicking on the following link:
% url 'testing' item_id=123 %
Note the activation link/code will be expired in expiration_days days.
我不知道这是否重要,但只是想我应该提到 activation_email.txt 存储在 myapp
的 templates 目录中,尽管它被 @ 使用987654332@。
另外,我使用的是 django 1.4
我有一种感觉,这个问题与 url 命名空间有关,这个我从来没有理解过的话题,但这只是一个幼稚的猜测。 (IMO,django 文档很好地解释了有关 django 的所有内容,除非涉及到 url 命名空间)
【问题讨论】:
【参考方案1】:我在这里不是专家,但在我正在处理的 Django 项目中,我使用不带引号的 url 名称。我刚刚在我的一个模板中的类似行周围添加了引号,它产生了与您的错误相同的错误。
试试:
% url testing item_id=123 %
【讨论】:
有趣~有效!!非常感谢。但这背后的理由是什么?我的意思是 django 文档中% url %
的所有示例都使用引号。
检查文档的命名 urls 部分:docs.djangoproject.com/en/dev/topics/http/urls/… 据我所知,如果您使用带有视图实际路径的 url 标签,那么您需要引号。如果使用名称,则不需要。
感谢您的参考。在模板标签文档中,有一个示例% url 'myapp:view-name' %
,所以我认为使用视图名称需要qoutes。我想这仅适用于我将视图名称与命名空间一起使用时,这有点令人困惑。
@ahmoo,他们正在摆脱 1.5 中未加引号的 url 标签,您可以 % load url from future %
使用始终使用引号的新标签行为,除非您传递一个解析的变量到一个字符串。
@John - 这是 YujiTomita 提到的信息的link。应该也放到官方文档的相关章节里了。以上是关于% url % 给我 NoReverseMatch 错误,而 reverse() 返回 url 就好了。为啥?的主要内容,如果未能解决你的问题,请参考以下文章
没有反向匹配 - django.urls.exceptions.NoReverseMatch
在 Django 中使用 % url % 时的 NoReverseMatch