2012-05-12 8 views
7

Ich habe den folgenden Eintrag in der urls.pyWie verwendet man die eingebaute 'password reset' Ansicht in Django?

(r'^password_reset/$', 'django.contrib.auth.views.password_reset'), 

gesetzt, aber sobald ich auf http://127.0.0.1:8000/password_reset/ gehe ich die Fehlermeldung:

NoReverseMatch at /password_reset/ 
Reverse for 'django.contrib.auth.views.password_reset_done' with arguments '()' and keyword arguments '{}' not found. 

ich auch password_reset_done Ansicht erwartete zu kommen aus die Kiste. Was soll ich jetzt tun?

UPDATE

Nach Blairs Lösung versucht, bekam ich einen Schritt näher.

(r'^password_reset_done/$', 'django.contrib.auth.views.password_reset_done'), 

Nach dem Buch ‚Django 1.0-Website-Entwicklung‘, diese integrierte Ansichten ohne weitere Mühe aus der Box verwendet werden sollen. Aber vielleicht hat sich das seit Django 1.0 geändert ... Wäre toll, wenn sich jemand dazu äußern könnte. Danke

+0

Warum hat jemand -1 ohne Erklärung dafür gewählt? Dies ist eine gültige Frage !!! – Houman

Antwort

3

Ich habe endlich die Lösung gefunden. Ich denke, es gibt immer das leichte Missverständnis zwischen MVC und MTV-Pattern. In MTV (Django) steht die View für den Controller und das Template für die View.

Daher ist zwar wahr, dass die Änderung Passwort "Ansichten" kommen out-of-the-Box, die tatsächlichen Vorlagen (Look & fühlen) muss noch vom Benutzer generiert werden, während das zugrunde liegende Formular (Widget) wird automatisch von Django generiert. Es wird klarer, wenn man den Code betrachtet.

hinzufügen Daher diese beiden Zeilen zu url.py

(r'^change-password/$', 'django.contrib.auth.views.password_change'), 
(r'^password-changed/$', 'django.contrib.auth.views.password_change_done'), 

dann unter myproject/templates/Registrierung Fügen Sie diese beiden Dateien

password_change_done.html

{% extends "base.html" %} 
{% block title %}Password Change Successful{% endblock %} 
{% block head %}Password Change Completed Successfully{% endblock %} 
{% block content %} 
    Your password has been changed successfully. Please re-login with your new credentials 
    <a href="/login/">login</a> or go back to the 
    <a href="/">main page</a>. 
{% endblock %} 

password_change_form.html

{% extends "base.html" %} 
{% block title %}Change Registration{% endblock %} 
{% block head %}Change Registration{% endblock %} 
{% block content %} 
    <form method="post" action="."> 
     {{form.as_p}} 
     <input type="submit" value="Change" /> 
     {% csrf_token %} 
    </form> 
{% endblock %} 

enter image description here

2

Django muss wissen, auf welche URL der Benutzer umgeleitet wird, sobald sie das Formular auf der Seite password_reset ausgefüllt haben. Fügen Sie Ihrer URL-Konfiguration eine weitere Zeile hinzu:

(r'^password_reset_done/$', 'django.contrib.auth.views.password_reset_done'), 
+0

Ich habe getan, was Sie vorgeschlagen haben, jetzt heißt es: TemplateDoesNotExist at/password_reset/... Ausnahmewert: registration/password_reset_form.html es macht mir nicht viel Sinn, wenn ich die Vorlage selbst erstellen musste. Fehle ich hier etwas? – Houman

+0

Nicht ganz sicher, ich habe immer benutzerdefinierte Vorlagen erstellt, so dass sie in das Thema des Rests der Website passen. Allerdings scheint es in der App django.contrib.admin einige passende Vorlagen zu geben. Wenn Sie also den Django-Admin aktiviert haben, werden sie möglicherweise verwendet. – Blair

0

Ab django 1,11 password_change Ansicht ist veraltet.

Veraltet seit Version 1.11: Die funktionsbasierte Ansicht password_change sollte durch die klassenbasierte PasswordChangeView ersetzt werden.

Was für mich gearbeitet wurde:

In Urls.py

from django.contrib.auth import views as auth_views 
... 
url('^account/change-password/$', 
    auth_views.PasswordChangeView.as_view(
     template_name='registration/passwd_change_form.html'), 
    name='password_change'), 
url(r'^account/password-change-done/$', 
    auth_views.PasswordChangeDoneView.as_view(
     template_name='registration/passwd_change_done.html'), 
    name='password_change_done'), 

und fügen Sie dann das Paar von Vorlagen passwd_change_form.html und passwd_change_done.html unter Registrierung.

Beachten Sie, dass ich nicht den Standardnamen verwenden, aus irgendeinem Grund, wenn ich tat, dass es auf die Django Admin-Ansichten voreingestellt.