Django-norel + Django-registro Problema: argumento inesperado de palabras clave 'UIDB36' Al restablecer la contraseña

StackOverflow https://stackoverflow.com/questions/6323852

Pregunta

Estoy usando Django-no vela con registro aplicación Las cosas parecen estar funcionando bien, excepto cuando trato de restablecer mi contraseña. Al hacer clic en el enlace RESET-Password que me envió por correo electrónico, Django produce un mensaje de error:

password_reset_confirm() got an unexpected keyword argument 'uidb36'

Mi pregunta: ¿Alguien lo ha visto y sabe cuál es la cura?

EDITAR:

El problema es causado por el registro auth_urls.py: duplican entradas en django contrib auth urls.py, la versión parcheada del archivo en django -norel.

¿Alguna idea por qué está ahí y puedo eliminarlo o arreglarlo de otra manera?

¿Fue útil?

Solución 2

Mi solución fue comentar los platillos de Url definidos en el registro auth_urls.py, y redefinirlos como una copia de Urlpatterns definidos en django.contrib.auth.

Aquí está mi auth_urls.py después del cambio:

"""
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'),
) 
'''

Otros consejos

Django 1.6 usa codificación Base 64 para la ID del usuario en lugar de la codificación de la base 36.

Si tiene URL de restablecimiento de contraseña personalizada, deberá actualizarlas reemplazando UIDB36 con UIDB64 y el tablero que sigue ese patrón con una barra. También agregue "_", "" y "-" a la lista de caracteres que pueden coincidir con el patrón UIDB64.

Por ejemplo, esta línea en URLS.py en 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'),

Deberá cambiarse a esto en 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'),

Aquí está el ChangeLog oficial que detalla el cambio:https://docs.djangoproject.com/en/1.6/releases/1.6/#django-contrib-auth-password-reset-uses-base-64-coding-of-user-pk

Solo tenía que cambiar el uidb36 argumentar uidb64, al igual que:

DE:

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

A:

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

Luego, los restos de contraseña comenzaron a funcionar nuevamente.

Supongo que su contraseña_reset_confirm URL en URLS.py se ve algo similar a

url (r '^cuentas/contraseña_reset/(? P [0-9-Za-Z] {1,13})-(? P [0-9-Za-Z] {1,13}-[0-9a -Za-Z] {1,20})/$ ', contraseña_reset_confirm, {' post_reset_redirect ':'/cuentas/contraseña_reset/complete/'}, name = "contraseña_reset_confirm"),),

y su enlace en contraseña_reset_email.html se ve como {{protocol}}: // {{dominio}} { % url 'contraseña_reset_confirm' uidb36 = uid token = token %}

Simplemente cambie UIB36 a UIB64 ambos lugares, funciona.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top