【问题标题】:Django 1.6 and django-registration: built-in authentication views not picked upDjango 1.6 和 django-registration:内置身份验证视图未拾取
【发布时间】: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 错误?

【问题讨论】:

    标签: django django-registration url-pattern django-1.6


    【解决方案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 存储库(如上面的官方拉取请求中所述)中提取:

    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 支持更新

    【讨论】:

    • 不是 django-registration no longer maintained 吗? (我宁愿这是 Django 的正式一部分,而不是 South,但也许这是 1.8 的东西!)
    • 我希望 django-registration 被某人接管(或者可能不会)。我将我的升级到 1.6,由于其他一切正常,我使用 fork 解决了这个问题。
    猜你喜欢
    • 2017-10-13
    • 1970-01-01
    • 2018-03-07
    • 2018-06-02
    • 2018-06-12
    • 1970-01-01
    • 2015-07-23
    • 2013-01-24
    • 2014-08-27
    相关资源
    最近更新 更多