19

我正在尝试将我的 webapp 从 Django 1.5 升级到 Django 1.6,并且作为我的 django 应用程序集的一部分,我正在使用django-registration 1.0

升级到 Django 1.6 后,我的应用程序不再识别内置身份验证视图。它们集成在 django 注册中,可以在这里看到,但它们停止工作。

Django 发行说明描述了这些视图的集成方式的变化,当将其与注册应用程序中看起来不错的源代码进行比较时。

我将注册网址介绍如下:

urlpatterns = patterns('',
     ...,
     url(r'^accounts/', include('registration.backends.default.urls')),
)

请求内置网址时出现错误,例如/accounts/password/change/

django.core.urlresolvers.NoReverseMatch

NoReverseMatch: Reverse for 'password_change_done' with arguments '()' and keyword arguments '{}' not found. 0 pattern(s) tried: []

有谁知道为什么我会收到无反向匹配错误?

4

3 回答 3

35

此错误的原因是django.contrib.auth.views使用了不同的 url 名称registration.auth_urls。要修复此问题,请覆盖默认 url,直到 django-registration 为 django 1.6 更新,并使用与 Django 相同的名称。

from django.contrib.auth import views as auth_views


urlpatterns = patterns('',

      #override the default urls
      url(r'^password/change/$',
                    auth_views.password_change,
                    name='password_change'),
      url(r'^password/change/done/$',
                    auth_views.password_change_done,
                    name='password_change_done'),
      url(r'^password/reset/$',
                    auth_views.password_reset,
                    name='password_reset'),
      url(r'^password/reset/done/$',
                    auth_views.password_reset_done,
                    name='password_reset_done'),
      url(r'^password/reset/complete/$',
                    auth_views.password_reset_complete,
                    name='password_reset_complete'),
      url(r'^password/reset/confirm/(?P<uidb64>[0-9A-Za-z]+)-(?P<token>.+)/$',
                    auth_views.password_reset_confirm,
                    name='password_reset_confirm'),

      #and now add the registration urls
      url(r'', include('registration.backends.default.urls')),
)
于 2013-11-15T08:34:21.433 回答
8

这是我使用的:

url(r'', include('registration.backends.default.urls')),
url(r'', include('django.contrib.auth.urls')),

Django contrib 现在包含缺少的 url

于 2014-05-17T07:46:04.953 回答
0

背景

对于 django-registration==1.0 和 Django==1.6,这个问题似乎再次出现,并在官方 django-registration 拉取请求中记录在这里。我使用了@Jay 提供的解决方案,但它不适用于密码重置部分。我最终遇到了这个错误:

错误

password_reset_confirm() got an unexpected keyword argument 'uidb36'

解决方案

相反,我通过执行以下操作从另一个 django-registration 存储库中提取(如上面的官方拉取请求中所述):

  1. pip 卸载 django-registration
  2. pip install git+git://github.com/macropin/django-registration.git
  3. 修改@Jay 帖子中提到的“urls.py”的代码(谢谢!)
  4. 请记住,这是一个临时解决方案,直到为 Django 1.6 更新官方 django-registration 支持
于 2014-06-09T16:13:23.230 回答