django url NoReverseMatch适用于第三方应用,但不适用于我的项目

时间:2013-05-08 05:04:49

标签: django templates django-urls

我正在将django-zinnia 0.12.3整合到我的django 1.4项目中。我已安装并正常工作。我想覆盖其zinnia / base.html模板,以便使用我的网站模板显示所有内容。百日草模板扩展了'zinnia / base.html'。

当我将文件zinnia / templates / zinnia / base.html复制到myproject / templates / zinnia / base.html时,所有zinnia {%url%}都停止工作并提供NoReverseMatch。即使我对文件进行了零更改。例如:

{% url 'zinnia_entry_archive_index' %}  --> returns:
    NoReverseMatch Reverse for ''zinnia_entry_archive_index'' ... not found
{% url 'admin:app_list' 'zinnia' %}" title="{% trans "Dashboard" %} --> returns:
    NoReverseMatch u"'admin" is not a registered namespace

我通过删除网址名称周围的引号来解决问题,例如:

{% url zinnia_entry_archive_index %}

但是,如果我删除了放在myproject / templates / zinnia中的base.html副本(换句话说,它使用了zinnia项目中的原始版本),则网址会再次起作用。

我的问题是为什么它适用于原始zinnia文件夹中的引号,但不能在我的项目文件夹中使用?

1 个答案:

答案 0 :(得分:1)

原因是在Django <= 3中,url标记的url名称不带引号。但是在Django 1.4+中,它已被弃用,而且没有引号的网址名称在Django 1.5中消失了:

因此,如果您使用Django <= 1.4,请不要删除网址名称周围的引号(除非您传递上下文变量)。如果你想升级你的django版本,那么出于兼容性原因这样做:

{% load url from future %}
{% url 'zinnia_entry_archive_index' %}

Documentation

  

不要忘记在函数路径或模式名称周围加上引号!

     

在Django 1.5中更改:第一个参数用于不引用,这是不一致的&gt;与其他模板标签。从Django 1.5开始,它按照通常的规则进行评估:&gt;它可以是带引号的字符串,也可以是在上下文中查找的变量。