渲染时出现NoReverseMatch错误:在渲染''django.contrib.auth.views.login''时找不到反向路径

26

我正在使用Django的身份验证,在login.html模板中,以下语句会生成一个错误:

{% url 'django.contrib.auth.views.login' %}

在/login处发生了TemplateSyntaxError:

在渲染时捕获到一个NoReverseMatch错误:找不到名为'django.contrib.auth.views.login'的反向解析(Reverse)函数,无参数,无关键字参数。

这个URL被定义在我的urls.py文件中:

(r'^login$', 'django.contrib.auth.views.login')

我已经安装了认证系统:

INSTALLED_APPS = (
    'django.contrib.auth',
...
)

有任何想法吗?

2个回答

65

截至Django 1.10版本:

从Django 1.10开始,不能再在url(){% url %}标签中使用字符串'django.contrib.auth.views.login'

首先,将您的URL模式更改为使用可调用对象,并命名URL模式。例如:

from django.contrib.auth import views as auth_views

url_patterns = [
    url(r'^login$', auth_views.login, name='login'),
]

然后将您的url标签更新为使用相同的名称:

{% url 'login' %}

从Django 1.5开始:

您不需要再使用{% load url from future %},只需使用带引号的语法({% url 'django.contrib.auth.views.login' %}),然后就完成了(请参见Django 1.5发布说明)。

从Django 1.3开始:

请注意,从Django 1.3开始(如Karen Tracey在下面的答案中所指出的),修复此问题的正确方法是添加:

{% load url from future %}

在您的模板顶部添加以下内容,然后使用:

{% url 'django.contrib.auth.views.login' %}

Django 1.3 之前:

根据错误信息(注意视图路径周围的双单引号),我猜测 {% url ... %} 标签不需要引号,请尝试:

{% url django.contrib.auth.views.login %}

@juankysmith - 发布一个新问题,包括您的模板代码和 urls.py,然后在此答案的评论中提及我,并附上您的问题URL,我很乐意帮忙查看。 - Dominic Rodger
2
我也可以。奇怪的是Django文档里有引号... - mgalgs
自从这个问题被写出来后,{% url %} 标签的语法已经发生了变化,现在需要加上引号(如果你正在使用 1.4 或以下版本中的 {% load url from future %},或者你正在使用 Django 的开发版本)。 - Dominic Rodger

9

带引号的语法是Django 1.3中新增的。在1.3及以后版本中,修复此错误的正确方法是在模板中包含{% load url from future %}。


我认为你应该在回答中包含这个链接(https://docs.djangoproject.com/en/dev/releases/1.3/#changes-to-url-and-ssi),以提供一些上下文,关于Django 1.3版本的发布说明。 - thomas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接