django - 登录视图没有反向匹配

时间:2011-12-25 17:36:44

标签: django

我只是在试用django并按照文档进行身份验证。

基本上我想查看用户登录表单页面,但我得到了:

Caught NoReverseMatch while rendering: Reverse for ''django.contrib.auth.views.login'' with arguments '()' and keyword arguments '{}' not found.

我的urls.py文件:

from django.conf.urls.defaults import patterns, include, url

urlpatterns = patterns('',
    url(r'^accounts/login/$', 'django.contrib.auth.views.login'),
)

我的settings.py(INSTALLED_APPS)

INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.staticfiles',
)

编辑:我意识到我在看错了。模板文件中出现错误:

{% if form.errors %}
<p>Your username and password didn't match. Please try again.</p>
{% endif %}

<form method="post" action="{% url 'django.contrib.auth.views.login' %}">
{% csrf_token %}
<table>
<tr>
    <td>{{ form.username.label_tag }}</td>
    <td>{{ form.username }}</td>
</tr>
<tr>
    <td>{{ form.password.label_tag }}</td>
    <td>{{ form.password }}</td>
</tr>
</table>

<input type="submit" value="login" />
<input type="hidden" name="next" value="{{ next }}" />
</form>

专门针对该行:

<form method="post" action="{% url 'django.contrib.auth.views.login' %}">

5 个答案:

答案 0 :(得分:35)

尝试为url设置名称并在url标记中使用它:

url(r'^accounts/login/$', 'django.contrib.auth.views.login', name='login'),

并在模板中:

<form method="post" action="{% url 'login' %}">

答案 1 :(得分:16)

试试这个:

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

编辑后:

<form method="post" action="{% url django.contrib.auth.views.login %}">

修改 在django的settings.py文件中,这一行:

APPEND_SLASH = False

告诉您的反向网址是否以斜线结尾。然后

APPEND_SLASH = True
url(r'^accounts/login/', 'django.contrib.auth.views.login')

应该也可以。

答案 2 :(得分:5)

尝试在网址

中添加name ='login'作为关键字
url(r'^accounts/login/$', 'django.contrib.auth.views.login', name='login'),

然后调用reverse('login')。

答案 3 :(得分:4)

在我看来,更好的 urls.py 文件(要干净且仍然非常明确),也为Django 1.10更新了:

from django.conf.urls import url
from django.contrib.auth import views as auth_views

urlpatterns = [
    url(r'^accounts/login/$', auth_views.login, name='login')
]

在模板中:

<form method="post" action="{% url 'login' %}">

请注意,url现在需要一个字符串,因此模板中的'login'必须使用引号。

答案 4 :(得分:1)

这与在project / urls.py文件中命名空间的应用网址有关。 一种解决方案是删除命名空间并明确写出每个URL,但是对于这个特定的问题......

这应该有效:

<form method="post" action="{% url '<namespace_name>:django.contrib.auth.views.login' %}">