% 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 存储在 myapptemplates 目录中,尽管它被 @ 使用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

使用 % url % 的 NoReverseMatch

在 Django 中使用 % url % 时的 NoReverseMatch

模板操作 url 中的 NoReverseMatch

按钮中的“NoReverseMatch”指的是在 url 中带有参数的页面

即使 url 模式正确,也获得 NoReverseMatch?