Django-nonrel + django-registration Проблема: неожиданный аргумент ключевого слова 'uidb36' при сбросе пароля
-
27-10-2019 - |
Вопрос
я использую Джанго-Нонрель с Регистрация приложение. Кажется, что все работает нормально, за исключением случаев, когда я пытаюсь сбросить свой пароль. Нажав ссылку с Reset-Password, отправленную мне по электронной почте, Django создает сообщение об ошибке:
password_reset_confirm() got an unexpected keyword argument 'uidb36'
Мой вопрос: кто -нибудь видел это и знает, что такое лекарство?
РЕДАКТИРОВАТЬ:
Проблема вызвана регистрацией auth_urls.py - они дублируют записи в django contrib urls.py, обстановка исправленной версии файла в Django -nonrel.
Любые идеи, почему это там, и могу ли я на самом деле удалить его или исправить иначе?
Решение 2
Мое решение состояло в том, чтобы прокомментировать urlpatterns, определенные в регистрации 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'),
)
'''
Другие советы
Django 1.6 использует кодирование базы 64 для идентификатора пользователя вместо кодирования базы 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-coding-user-pk
Мне просто нужно было изменить uidb36
аргумент uidb64
, вот так:
ИЗ:
url(r'^password/reset/confirm/(?P<uidb36>[0-9A-Za-z]+)-(?P<token>.+)/$',
К:
url(r'^password/reset/confirm/(?P<uidb64>[0-9A-Za-z]+)-(?P<token>.+)/$',
Затем сброс пароля снова начал работать.
Я предполагаю, что ваш 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/with/'}, name = "password_reset_confirm"),
и ваша ссылка в password_reset_email.html выглядит как {{protocol}}: // {{domain}} { % url 'password_reset_confirm' uidb36 = uid token = token %}}}}}}}}}}}}}}}}}}
Просто измените UIB36 на UIB64 оба места, это работает.