Проблем с Django-nonrel + Django-регистрация: неочакван аргумент за ключова дума 'uidb36' при нулиране на парола

Използвам Django-nonrel с регистрация приложение. Нещата изглеждат добре, освен когато се опитам да нулирам паролата си. Когато щракна върху връзката за нулиране на парола, изпратена ми по имейл, Django извежда съобщение за грешка:

password_reset_confirm() got an unexpected keyword argument 'uidb36'

Моят въпрос: някой виждал ли го е и знае ли какво е лекарството?

РЕДАКТИРАНЕ:

Проблемът е причинен от registration\auth_urls.py - те дублират записи в django\contrib\auth\urls.py, заобикаляйки коригираната версия на файла в Django-nonrel.

Някакви идеи защо е там и мога ли всъщност да го премахна или да го поправя по друг начин?


person mhl666    schedule 12.06.2011    source източник


Отговори (4)


Django 1.6 използва кодиране base 64 за ID на потребителя вместо кодиране base 36.

Ако имате персонализирани URL адреси за повторно задаване на парола, ще трябва да ги актуализирате, като замените uidb36 с uidb64 и тирето, което следва този модел, с наклонена черта. Също така добавете "_", "\" и "-" към списъка със знаци, които може да съответстват на модела uidb64.

Например този ред в urls.py в Django 1.5-:

url(r'^reset/(?P<uidb36>[0-9A-Za-z]+)-(?P<token>.+)/$',
    'django.contrib.auth.views.password_reset_confirm',
    name='password_reset_confirm'),

Ще трябва да се промени на това в Django 1.6+:

url(r'^reset/(?P<uidb64>[0-9A-Za-z_\-]+)/(?P<token>.+)/$',
    'django.contrib.auth.views.password_reset_confirm',
    name='password_reset_confirm'),

Ето официалния регистър на промените, който описва подробно промяната: https://docs.djangoproject.com/en/1.6/releases/1.6/#django-contrib-auth-password-reset-uses-base-64-encoding-of-user-pk

person Aidan    schedule 03.12.2013
comment
поправете ме, ако греша, но този въпрос беше много преди django 1.6, нали? Все пак добър линк с добра информация - person Josh Brown; 29.01.2014
comment
Възможно е той да е използвал бета версия или приложението за регистрация да е актуализирало своите URL модели в очакване. И в двата случая мисля, че решението ще свърши работа за него. - person Aidan; 30.01.2014

Моето решение беше да коментирам urlpatterns, дефинирани в registration\auth_urls.py, и да ги предефинирам като копие на urlpatterns, дефинирани в django.contrib.auth.

Ето моя auth_urls.py след промяната:

"""
URL patterns for the views included in ``django.contrib.auth``.

Including these URLs (via the ``include()`` directive) will set up the
following patterns based at whatever URL prefix they are included
under:

* User login at ``login/``.

* User logout at ``logout/``.

* The two-step password change at ``password/change/`` and
  ``password/change/done/``.

* The four-step password reset at ``password/reset/``,
  ``password/reset/confirm/``, ``password/reset/complete/`` and
  ``password/reset/done/``.

The default registration backend already has an ``include()`` for
these URLs, so under the default setup it is not necessary to manually
include these views. Other backends may or may not include them;
consult a specific backend's documentation for details.

"""

from django.conf.urls.defaults import *

#from django.contrib.auth import views as auth_views

from django.contrib.auth import urls as auth_urls

urlpatterns = auth_urls.urlpatterns

'''
Commented out, this is what caused my problems:

urlpatterns = patterns('',
                       url(r'^login/$',
                           auth_views.login,
                           {'template_name': 'registration/login.html'},
                           name='auth_login'),
                       url(r'^logout/$',
                           auth_views.logout,
                           {'template_name': 'registration/logout.html'},
                           name='auth_logout'),
                       url(r'^password/change/$',
                           auth_views.password_change,
                           name='auth_password_change'),
                       url(r'^password/change/done/$',
                           auth_views.password_change_done,
                           name='auth_password_change_done'),
                       url(r'^password/reset/$',
                           auth_views.password_reset,
                           name='auth_password_reset'),
                       url(r'^password/reset/confirm/(?P<uidb36>[0-9A-Za-z]+)-(?P<token>.+)/$',
                           auth_views.password_reset_confirm,
                           name='auth_password_reset_confirm'),
                       url(r'^password/reset/complete/$',
                           auth_views.password_reset_complete,
                           name='auth_password_reset_complete'),
                       url(r'^password/reset/done/$',
                           auth_views.password_reset_done,
                           name='auth_password_reset_done'),
) 
'''
person mhl666    schedule 13.06.2011
comment
коя версия на Django използвате? Имам същия проблем, но изглежда, че файловата структура на моето приложение за удостоверяване е малко по-различна от вашата. - person ductionist; 15.06.2011
comment
Изтеглих най-новия Django-nonrel. Гледайки моя django_init_, виждам: VERSION = (1, 3, 0, 'final', 0), така че това трябва да е Django 1.3. - person mhl666; 15.06.2011

Просто трябваше да променя аргумента uidb36 на uidb64, така:

ОТ:

url(r'^password/reset/confirm/(?P<uidb36>[0-9A-Za-z]+)-(?P<token>.+)/$',

TO:

url(r'^password/reset/confirm/(?P<uidb64>[0-9A-Za-z]+)-(?P<token>.+)/$',

След това нулирането на паролата започна да работи отново.

person Matt Williamson    schedule 21.12.2011

Предполагам, че вашият URL адрес на password_reset_confirm в urls.py изглежда нещо подобно на

url(r'^accounts/password_reset/(?P[0-9A-Za-z]{1,13})-(?P[0-9A-Za-z]{1,13}-[0-9A -Za-z]{1,20})/$', password_reset_confirm, {'post_reset_redirect' : '/accounts/password_reset/complete/'},name="password_reset_confirm"),

и вашата връзка в password_reset_email.html изглежда като {{ protocol }}://{{ domain }}{% url 'password_reset_confirm' uidb36=uid token=token %}

Просто променете uib36 на uib64 и на двете места, работи.

person MANOJ REDDY    schedule 16.02.2017