【问题标题】:django url NoReverseMatch works in 3rd party app but not my projectdjango url NoReverseMatch 适用于 3rd 方应用程序,但不适用于我的项目
【发布时间】:2013-05-08 05:04:48
【问题描述】:

我正在将 django-zinnia 0.12.3 集成到我的 django 1.4 项目中。我已经安装并工作了。我想覆盖它的 zinnia/base.html 模板,以便所有内容都使用我网站的模板显示。 zinnia 模板扩展了“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 项目中的原始副本),这些 url 将再次起作用。

我的问题是为什么它可以使用原始百日草文件夹中的引号,而不是我的项目文件夹中的引号?

【问题讨论】:

    标签: django templates django-urls


    【解决方案1】:

    原因是在Django <= 3 中,url 标签采用不带引号的url 名称。但是在Django 1.4+ 中它已被弃用,并且不带引号的url 名称在Django 1.5 中消失了:

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

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

    Documentation

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

    在 Django 1.5 中更改:第一个参数以前没有被引用,这与其他模板标签不一致 >。从 Django 1.5 开始,它根据通常的规则进行评估: > 它可以是带引号的字符串或将在上下文中查找的变量。

    【讨论】:

    • 谢谢,但这并不能解释为什么它可以在应用程序的模板文件夹中工作,但不能在我项目的根模板文件夹中工作。两者都在同一个项目中运行,因此都是 Django 1.4。我没有更改模板中的任何内容,因此它应该使用相同的 url 模板标签。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-31
    • 1970-01-01
    • 1970-01-01
    • 2019-10-25
    • 2019-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多