小能豆

从 v1.9 升级到 v1.10 后 NoReverseMatch

py

我刚刚升级到 django v1.10,正在进行测试以检查一切是否正常,但我已经进入Reverse for 'django.contrib.auth.views.login' with arguments '()' and keyword arguments '{}' not found. 0 pattern(s) tried: []登录页面。

我正在使用 django-registration 并已调用以获取登录页面<a href="/accounts/login/">Login</a>

然后我收到针对此 html 的错误消息,这就是<form method="post" action="{% url 'django.contrib.auth.views.login' %}">引发错误的原因。

<div class="container">
  <div class="row text-center">
    <div class="col-sm-12">
          <form method="post" action="{% url 'django.contrib.auth.views.login' %}">{% csrf_token %}
            <span style="color:green">{{msg}}</span><br>
            <table align="center">{{ form }}</table>
            <button type="submit" class="btn btn-primary btn-sm">Login</button>
          </form>
          <a href="/password/recover" class="btn btn-primary btn-sm">Forgotten Password</a>
    </div>
  </div>
</div>

我没有改变 urls.py,它看起来包括:

url(r'^accounts/', include('registration.backends.hmac.urls')),

从 1.9 到 1.10,我没有做任何改动(我尝试修复这个问题时所做的改动都被我恢复了)。如能得到任何帮助,我将不胜感激。


阅读 5

收藏
2024-11-20

共1个答案

小能豆

在 Django 1.10 中,URL 路由机制发生了变化,这可能是你遇到问题的原因。从你提供的信息来看,问题出在你试图使用 {% url 'django.contrib.auth.views.login' %} 来生成登录页面的 URL,但 Django 似乎找不到这个 URL。

Django 1.10 引入了新的 URL 解析方式,并且 django.contrib.auth.views.login 这个视图的 URL 名称可能发生了变化。你提到你使用的是 django-registration,它通常会提供处理用户认证(包括登录、注册等)的 URL。

解决方案

1. 使用 registration 的 URL

django-registration 中,登录视图通常会通过以下 URL 访问:

url(r'^accounts/', include('registration.backends.hmac.urls')),

这条路由已经为你提供了注册、登录等功能。你应该使用 registration 的 URL 名称,而不是直接使用 django.contrib.auth.views.login

请确保在模板中正确使用 registration 的登录 URL。你可以尝试修改你的模板代码:

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

这将调用 django-registration 包的登录视图,而不是 django.contrib.auth.views.login

2. 检查 URL 配置

如果你仍然希望直接使用 django.contrib.auth.views.login 视图,确保 django.contrib.auth 的 URL 配置已正确加载。在 urls.py 中,你需要显式地包括 django.contrib.auth.urls,如下所示:

from django.contrib.auth import views as auth_views

urlpatterns = [
    url(r'^accounts/', include('registration.backends.hmac.urls')),
    url(r'^accounts/login/$', auth_views.LoginView.as_view(), name='login'),
]

这会为 django.contrib.auth.views.login 设置一个 URL,确保模板中的 {% url 'django.contrib.auth.views.login' %} 能正确解析。

总结

  1. 尝试将模板中的 URL 名称从 django.contrib.auth.views.login 改为 registration.login,这应该与 django-registration 的默认配置兼容。
  2. 如果你希望直接使用 django.contrib.auth.views.login,确保在 urls.py 中正确配置该视图。

这应该能解决你遇到的问题。

2024-11-20