Django-nonrel + problème Django-enregistrement: mot-clef argument inattendu 'uidb36' mot de passe lors de la réinitialisation
-
27-10-2019 - |
Question
J'utilise Django-nonrel avec app inscription. Les choses semblent fonctionner très bien, sauf lorsque je tente de réinitialiser mon mot de passe. En cliquant sur le lien reset-mot de passe m'a été envoyé par e-mail, Django produit un message d'erreur:
password_reset_confirm() got an unexpected keyword argument 'uidb36'
Ma question: Quelqu'un a vu et sait ce qui est le remède
?EDIT:
Le problème est causé par l'enregistrement \ auth_urls.py - ils les entrées en double dans django \ contrib \ auth \ urls.py, circumwenting version patchée du fichier dans Django-nonrel.
Toutes les idées pourquoi est-il là-bas et je peux réellement supprimer ou corriger autrement?
La solution 2
Ma solution a été de commenter urlpatterns définis dans l'enregistrement \ auth_urls.py, et les redéfinir comme une copie de urlpatterns définies dans django.contrib.auth.
Voici mon auth_urls.py après le changement:
"""
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'),
)
'''
Autres conseils
Django 1.6 Utilisations base 64 codant pour l'ID de l'utilisateur à la place de la base 36 codage.
Si vous avez des URL de réinitialisation de mot de passe personnalisé, vous devez les mettre à jour en remplaçant uidb36 avec uidb64 et le tableau de bord qui suit ce modèle avec une barre oblique. Ajouter également « _ », « \ » et « - ». à la liste des caractères qui peuvent correspondre au motif uidb64
Par exemple cette ligne urls.py dans 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'),
devra-t-être changé à cela dans 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'),
Voici le changelog officiel qui détaille le changement: https://docs.djangoproject.com/en/1.6/releases/1.6/#django-contrib-auth-password-reset-uses-base-64-encoding-of-user-pk
Je viens d'avoir à changer l'argument uidb36
à uidb64
, comme suit:
FROM:
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>.+)/$',
Puis remet à zéro le mot de passe a commencé à travailler à nouveau.
Je suppose que votre url password_reset_confirm à urls.py ressemble quelque chose de similaire à
url (r '^ représente / 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': '/ comptes / password_reset / complet /'}, name = "password_reset_confirm"),
et votre lien dans les regards password_reset_email.html comme {{Protocole}}: // {{domain}} {% url 'password_reset_confirm' uidb36 = uid = jeton jeton%}
Il suffit de changer uib36 à la fois uib64 les lieux, cela fonctionne.