反向匹配错误

34

我一直在django登录系统中遇到这个错误。这是我的urls.py的一部分:

     (r'^contractManagement/login', 'django.contrib.auth.views.login', {'template_name': 'login.html'}),

我遇到的确切错误:

Exception Type: NoReverseMatch
Exception Value:    Reverse for ''django.contrib.auth.views.login'' with arguments '()' and keyword arguments '{}' not found.

我不明白为什么会出现这个错误。如果您需要其他信息,请告诉我。


1
你的反向语句在哪里? - MattoTodd
3个回答

44

您没有展示您试图反转这个URL的地方,但看起来您已经将其用双引号括起来了。如果您正在使用url标签,请注意不需要在URL名称周围使用引号:

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

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

6
这是教程的错误吗?因为我刚刚算出来是这样的。 - Dean
1
是的,这似乎是https://docs.djangoproject.com/en/dev/topics/auth/#django.contrib.auth.views.login示例中教程中的一个缺陷。 - Mark Chackerian
6
总结一下,Django 1.4不需要引号,而1.5则需要。更多关于这个问题的细节可以在这个问题中找到:https://dev59.com/umPVa4cB1Zd3GeqP3jiM - Bruno Girin
1
从Django 1.5开始,引号的使用是语法的一部分。对于1.4及以下版本,不需要引号。 - Nabeel Ahmed

19

您可以看到''the.unknown.view''包含过多的引号。

这是因为在Django 1.5及更高版本中,使用引号语法是有效的。但对于Django 1.3或1.4,您需要在模板中添加以下代码以启用未来行为:

{% load url from future %}

这个例子适用于Django 1.5及以上版本。

{% url "path.to.some.view" %}

Django 1.4.x 及以下版本的经典语法(不需要 "future" 命令)是:

{% url path.to.some.view %}

啊,views.login文档中的示例模板包含了未来的URL事项,但没有提到它的含义(我假设它与extends "base.html"行有关,所以忽略了它,结果就遇到了这个问题!) - dbr

6

我建议你为你的URL命名(要这样做,需要使用URL方法)。此外,你应该在所有的URL后面添加一个斜线,因为如果不这样做,Django CommonMiddleware会对所有的URL进行302重定向:

from django.conf.urls.defaults import *

urlpatterns = patterns('',
     url(r'^contractManagement/login/', 'django.contrib.auth.views.login', {'template_name': 'login.html'}, name='contract_login'),

)

那么您可以在代码中使用reverse,或在模板中使用url。如果您决定更改实际的网址(例如:changedContractManagement/login/),只要名称相同,您的代码仍然有效。

在代码中:

from django.core.urlresolvers import reverse
reverse('contract_login')

在模板中:

{% url contract_login %}

编辑:根据MrOodles的建议


要导入reverse:from django.core.urlresolvers import reverse - MrOodles

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