Django-nonrel + Django-Registrierungsproblem: Unerwartetes Keyword-Argument 'UIDB36' Beim Zurücksetzen des Passworts

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

Frage

Ich benutze Django-nonrel mit Anmeldung App. Die Dinge scheinen gut zu funktionieren, außer wenn ich versuche, mein Passwort zurückzusetzen. Beim Klicken auf das an mich in E-Mail an mich gesendete Reset-Password-Link erstellt Django Fehlermeldung:

password_reset_confirm() got an unexpected keyword argument 'uidb36'

Meine Frage: Hat es jemand gesehen und weiß, was die Heilung ist?

BEARBEITEN:

Das Problem wird durch die Registrierung auth_urls.py verursacht - sie duplizieren Einträge in Django live auth urls.py, umgab die Patch -Version der Datei in Django -nonrel.

Irgendwelche Ideen, warum ist es da und kann ich es tatsächlich entfernen oder sonst reparieren?

War es hilfreich?

Lösung 2

Meine Lösung bestand darin, Urlpattern zu kommentieren, die in der Registrierung auth_urls.py definiert sind, und sie als Kopie von Urlpattern neu definieren, die in Django.contrib.auth definiert sind.

Hier ist mein auth_urls.py nach der Änderung:

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

Andere Tipps

Django 1.6 verwendet die Basis 64 -Codierung für die ID des Benutzers anstelle der Basis 36 -Codierung.

Wenn Sie URLs mit benutzerdefiniertem Kennwort zurücksetzen, müssen Sie diese aktualisieren, indem Sie UIDB36 durch UIDB64 und das Strich durch das Muster durch einen Schrägstrich ersetzen. Fügen Sie auch "_", "" und "-" zu der Liste der Zeichen hinzu, die möglicherweise mit dem UIDB64-Muster übereinstimmen.

Zum Beispiel diese Zeile in 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'),

Muss in Django 1.6+ in dies geändert werden:

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

Hier ist der offizielle Changelog, der die Änderung beschreibt:https://docs.djangoproject.com/en/1.6/releases/1.6/#django-contrib-auth-password-reset-us-base-64-coding-of-user-pk

Ich musste nur die ändern uidb36 Argument an uidb64, wie so:

AUS:

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

ZU:

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

Dann begann das Passwort zurückzugewinnen.

Ich denke

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 ':'/contots/password_reset/complete/'}, name = "password_reset_confirm"),

und Ihr Link in password_reset_email.html sieht aus wie {{Protocol}}: // {{Domäne}} { % url 'password_reset_confirm' uidb36 = uid token = token %}

Wechseln Sie einfach UIB36 in UIB64 beide Orte, es funktioniert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top