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 使用别名和 apache 提供静态管理文件
Django 1.6 最佳实践: 如何设置django项目的设置(settings.py)和部署文件(requirements.txt)