2012-05-12 9 views
7

Ho impostato la seguente voce nel urls.pyCome utilizzare la vista incorporata 'password_reset' in Django?

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

ma una volta che vado a http://127.0.0.1:8000/password_reset/ ricevo il seguente messaggio di errore:

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

mi aspettavo vista password_reset_done anche essere venuta fuori la scatola. Quindi cosa dovrei fare in questa fase?

UPDATE

Dopo aver provato la soluzione di Blair, ho ottenuto un passo più vicino.

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

Secondo il libro 'di sviluppo Django 1.0 sito web', questi built-in vista dovrebbero essere utilizzati fuori dalla scatola, senza ulteriori problemi. Ma forse è cambiato da quando Django 1.0 ... Sarebbe bello se qualcuno potesse far luce su questo. Grazie

+0

Perché qualcuno ha votato -1 su questo senza alcuna spiegazione? Questa è una domanda valida !!! – Houman

risposta

3

Ho finalmente trovato la soluzione. Penso che ci sia sempre il leggero fraintendimento tra MVC e MTV. In MTV (Django) la vista indica il controller e il modello indica la vista.

Quindi, mentre è vero che la password di modifica "Views" sta per essere incorporata, i modelli attuali (vedi & feel) devono ancora essere generati dall'utente mentre il modulo sottostante (widget) viene generato automaticamente da Django. Diventa più chiaro guardando il codice.

Quindi aggiungere queste due righe per url.py

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

poi sotto mioprogetto/templates/registrazione aggiungere questi due file

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 deve sapere quale URL reindirizzare l'utente a una volta completato il modulo nella pagina password_reset. Quindi aggiungi un'altra riga alla configurazione dell'URL:

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

Ho fatto quello che mi hai suggerito, ora dice: TemplateDoesNotExist a/password_reset/... Valore di eccezione: registration/password_reset_form.html non ha molto senso per me, se dovessi creare il modello da solo. Mi sto perdendo qualcosa? – Houman

+0

Non completamente sicuro, ho sempre creato modelli personalizzati in modo che si adattino al tema del resto del sito. Detto questo, sembra che ci siano alcuni modelli di corrispondenza nell'app django.contrib.admin, quindi se hai l'amministratore di Django abilitato potrebbero essere usati? – Blair

0

Al django 1.11 password_change vista è obsoleto.

Obsoleto dalla versione 1.11: la vista basata su password_change deve essere sostituita da PasswordChangeView basata su classe.

Che cosa ha funzionato per me era:

In URL.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'), 

e quindi aggiungere il paio di modelli passwd_change_form.html e passwd_change_done.html sotto registrazione.

Nota che non sto utilizzando il nome predefinito, per qualche motivo quando l'ho fatto per impostazione predefinita alle visualizzazioni admin di django.

Problemi correlati