Django 1.6 和 django-registration:内置身份验证视图未拾取

Posted

技术标签:

【中文标题】Django 1.6 和 django-registration:内置身份验证视图未拾取【英文标题】:Django 1.6 and django-registration: built-in authentication views not picked up 【发布时间】:2013-11-27 21:40:33 【问题描述】:

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

升级到 Django 1.6 后,我的应用程序不再识别 built-in authentication views。它们已集成在 django 注册中,如 here 所示,但它们停止工作。

Django 发行说明描述了一个change in the way these views should be integrated,将其与注册应用程序中的源代码进行比较时看起来不错。

我将注册网址介绍如下:

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: []

有没有人知道为什么我会收到一个 no-reverse-match 错误?

【问题讨论】:

【参考方案1】:

这个错误的原因是django.contrib.auth.views 使用了与registration.auth_urls 不同的url 名称。要修复此问题,请覆盖默认 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')),
)

【讨论】:

我将上面列出的代码 Jay 添加到我的 registration/backends/simple/urls.py 中。我猜如果您使用默认值,您会将其添加到registration/backends/default/urls.py。这对我有用。 我也这样做了,它对我有用,但是我的模板被忽略了,Django Admin 模板被用于密码重置和更改密码。 在 django-registration 存储库中有一个针对此问题的公开拉取请求。我认为它将被集成到下一个版本中。关注这里的讨论:bitbucket.org/ubernostrum/django-registration/pull-request/63 Macropin 的 django-registration fork 有这个修复。 pip uninstall django-registration,然后是pip install -e git+https://github.com/macropin/django-registration#egg=django-registration 附言。我问过 Django 的人是否想支持 django-registration,因为如果没有注册支持,提供 user/auth 的东西似乎是不完整的,但他们目前似乎并不热衷:groups.google.com/forum/#!topic/django-developers/yawNAWE4d1o【参考方案2】:

这是我使用的:

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

Django contrib 现在包含缺少的 url

【讨论】:

目前这对我来说实际上很好用。不过会留意的。【参考方案3】:

背景

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

错误

password_reset_confirm() got an unexpected keyword argument 'uidb36'

解决方案

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

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

【讨论】:

不是 django-registration no longer maintained 吗? (我宁愿这是 Django 的正式一部分,而不是 South,但也许这是 1.8 的东西!) 我希望 django-registration 被某人接管(或者可能不会)。我将我的升级到 1.6,由于其他一切正常,我使用 fork 解决了这个问题。

以上是关于Django 1.6 和 django-registration:内置身份验证视图未拾取的主要内容,如果未能解决你的问题,请参考以下文章

Django 1.6 - 以编程方式创建组和权限

在 Django 1.5/1.6 中设置两种不同类型的用户

django 1.6 使用别名和 apache 提供静态管理文件

Django 1.6 最佳实践: 如何设置django项目的设置(settings.py)和部署文件(requirements.txt)

Django settings — Django 1.6 documentation

在为 Django 1.6 和 1.7 设计应用程序时,是不是有推荐的处理 AppConfig 的方法?