Django-nonrel + problema django-registrazione: inattesa parola chiave argomento 'uidb36' quando reimpostare la password

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

Domanda

Django-nonrel con registrazione app. Le cose sembrano funzionare bene, tranne quando provo a resettare la password. Cliccando sul link di reimpostazione della password-inviato a me in email, Django genera un messaggio di errore:

password_reset_confirm() got an unexpected keyword argument 'uidb36'

La mia domanda: qualcuno ha visto e sa qual è la cura

?

Modifica

Il problema è causato da registrazione \ auth_urls.py - hanno duplicato le voci in Django \ contrib \ auth \ urls.py, circumwenting versione modificata del file in Django-nonrel.

Tutte le idee perché è lì e posso realmente rimuoverlo o risolvere il problema in altro modo?

È stato utile?

Soluzione 2

La mia soluzione era quella di commentare urlpatterns definiti nella registrazione \ auth_urls.py, e ridefinire come copia di urlpatterns definiti django.contrib.auth.

Ecco il mio auth_urls.py dopo la modifica:

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

Altri suggerimenti

Django 1.6 Usi Base 64 codifica per l'ID dell'utente, invece di base 36 codifica.

Se avete qualsiasi URL di reimpostazione password personalizzata, è necessario aggiornarli sostituendo uidb36 con uidb64 e il trattino che segue quel modello con una barra. aggiungere anche "_", "\" e "-". all'elenco dei caratteri che possono corrispondere al modello uidb64

Ad esempio questa linea nel urls.py in 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'),

Sarà bisogno di essere cambiato a questo in 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'),

Ecco il changelog ufficiale che dettaglia il cambiamento: https://docs.djangoproject.com/en/1.6/releases/1.6/#django-contrib-auth-password-reset-uses-base-64-encoding-of-user-pk

Ho appena dovuto cambiare l'argomento uidb36 a uidb64, in questo modo:

DA:

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>.+)/$',

reimpostazione delle password poi ha cominciato a lavorare di nuovo.

I guess your password_reset_confirm url in urls.py looks something similar to

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

and your link in password_reset_email.html looks like {{ protocol }}://{{ domain }}{% url 'password_reset_confirm' uidb36=uid token=token %}

Just change uib36 to uib64 both the places,it works.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top