Django 1.6 and django-registration: built-in authentication views not picked up
Asked Answered
H

3

19

I am trying to upgrade my webapp from Django 1.5 to Django 1.6 and as part of my set of django apps I am using django-registration 1.0.

After upgrading to Django 1.6 my app does not recognize the built-in authentication views any more. They are integrated in django registration as can be seen here, but they stopped working.

The Django release notes describe a change in the way these views should be integrated, when comparing that to the source code in the registration-app that looks fine.

I am introducing the registration urls as follows:

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

I get the an error when requesting the built in urls such as /accounts/password/change/

django.core.urlresolvers.NoReverseMatch

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

Does anyone have an idea why I get a no-reverse-match error?

Homily answered 14/11, 2013 at 18:8 Comment(0)
L
35

The reason for this error is that the django.contrib.auth.views use different url names than the registration.auth_urls ones. To patch this problem, override the default urls until django-registration gets updated for django 1.6, and use the same names as 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')),
)
Latt answered 15/11, 2013 at 8:34 Comment(5)
I added the code Jay listed above to my registration/backends/simple/urls.py . I guess if you are using the default you would add it to registration/backends/default/urls.py. That worked for me.Armagnac
I did this also, and it works for me, however my templates are being ignored and the Django Admin templates are being used for password reset and change password.Hindu
There is an open pull request for this issue on the django-registration repository. I would assume it will be integrated in the next release. Follow the discussion here: bitbucket.org/ubernostrum/django-registration/pull-request/63Homily
Macropin's django-registration fork has this fix. pip uninstall django-registration, then pip install -e git+https://github.com/macropin/django-registration#egg=django-registrationJenine
P.s. I've asked the Django guys if they want to support django-registration, as providing the user/auth stuff seems incomplete without registration support, but they don't seem keen at the moment: groups.google.com/forum/#!topic/django-developers/yawNAWE4d1oJenine
F
8

Here is what I used:

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

Django contrib now includes the missing urls

Fimbriate answered 17/5, 2014 at 7:46 Comment(1)
This actually works fine for me at the moment. Will keep an eye on it though.Jenine
D
0

Background

This issue seems to have cropped again for django-registration==1.0 and Django==1.6 and is documented here on the official django-registration pull request. I used the solution provided by @Jay but it didn't work specifically for the password reset part. I ended up with this error:

Error

password_reset_confirm() got an unexpected keyword argument 'uidb36'

Solution

Instead I pulled from another django-registration repository (as mentioned in the official pull request above) by doing the following:

  1. pip uninstall django-registration
  2. pip install git+git://github.com/macropin/django-registration.git
  3. Modify the code for 'urls.py' as mentioned in the post by @Jay (thanks!)
  4. Remember this is a temporary solution until the official django-registration support is updated for Django 1.6
Denbrook answered 9/6, 2014 at 16:13 Comment(2)
Isn't django-registration no longer maintained? (I'd much rather this were made officially part of Django than South, but maybe that's something for 1.8!)Jenine
I'm hoping the django-registration is taken over by someone (or maybe it won't be). I upgraded mine to 1.6 and since everything else was working, I used the fork to fix this issue.Denbrook

© 2022 - 2024 — McMap. All rights reserved.