【问题标题】:TemplateSyntaxError despite name defined?TemplateSyntaxError 尽管名称已定义?
【发布时间】:2012-08-11 00:39:52
【问题描述】:

我在urls.py 中有以下行:

url(r'^changepassword/$', 'django.contrib.auth.views.password_change',
    {'template_name': 'account/changepass.html', 
     'post_change_redirect' : reverse('settings')}, name='change_password'),

但是,当加载不同的视图(带有指向此 url 的链接)时,我得到一个 TemplateSyntaxError

/account/ 处的模板语法错误

渲染时捕获 NoReverseMatch:未找到带有参数“()”和关键字参数“{}”的“change_password”的反向。

In template ..../templates/account/settings.html, error at line 7

<p><a href='{% url change_password %}'>Change your password</a>

可能出了什么问题?

【问题讨论】:

    标签: django django-templates


    【解决方案1】:

    您不应在加载 url 配置之前执行的代码中使用 reverse,例如在 settings.py 中,或者在您的情况下是 url 配置。

    从 Django 1.4 开始,在这些情况下,您可以使用 reverse_lazy 而不是 reverse

    【讨论】:

      【解决方案2】:

      删除 reverse 调用并将其简单地更改为 /settings/ 修复了此问题。我不确定为什么reverse 在这里不起作用。

      【讨论】:

        【解决方案3】:

        试试:<a href='{% url "change_password" %}'>(名称用引号括起来 - change_password 应该是字符串,而不是模板变量)

        【讨论】:

        • -1 直到 Django 1.5,或者除非 OP 使用 {% load url from future %}
        • @supervacuo:谁说 OP 不是使用{% load url from future %}?您的评论是有根据的;否决票不是。
        • 如果@Timmy 更新答案,我很高兴将 -1 变成 0 甚至 +1。在那之前,关于{% url %} 标签的说法是错误的; -1的完美使用
        • 我真的不是在这里乞求您的支持。 OP 完全有可能使用future,无论哪种方式区分字符串和模板变量都是一种很好的做法
        【解决方案4】:

        你可以这样使用:{% url django.contrib.auth.views.password_change %}

        【讨论】:

        • 尝试使用 reverse_lazy 代替 reverse。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-17
        相关资源
        最近更新 更多