2012-06-21 10 views
17

Ho un problema con il funzionamento del bit password_Reset_confirm.NoReverseMatch on password_Reset_confirm

url:

(r'^password_reset/$', 'django.contrib.auth.views.password_reset'), 
(r'^password_reset_done/$', 'django.contrib.auth.views.password_reset_done'), 
(r'^password_reset_confirm/(?P<uidb36>[0-9A-Za-z]+)-(?P<token>.+)/$', 'django.contrib.auth.views.password_reset_confirm'), 

password_reset_email.html, che comprende questo:

{% load url from future %} 
Someone asked for password reset for email {{ email }}. Follow the link below: 
{{ protocol}}://{{ domain }}{% url 'password_reset_confirm' uidb36=uid token=token %} 

Ma poi dopo aver presentato la mia email per resettare la password, ottengo questo messaggio di errore visualizzato:

NoReverseMatch a/password_reset/Reverse per 'password_reset_confirm' con argomenti '()' e argomenti parola chiave '{' uidb36 ':' 1 ',' token ':' 38d-b5ec0b2a2321f522f954 '}' non trovato.

Pensavo che dal momento che questo utilizzava una build in vista, non avrei dovuto preoccuparmi di nient'altro?

Grazie per la consulenza,

Aggiornamento:

Dopo aver utilizzato il percorso completo, sembra funzionare. Tuttavia invia due email: e ognuna ha un link diverso. Perché? E dove imposto il {{dominio}}? Grazie

Follow the link below: 
http://example.com/password_reset_confirm/1-38d-b5ec0b2a2321f522f954/ 

Follow the link below: 
http://example.com/password_reset_confirm/2-38d-18482e1f129c84b9c2bc/ 

Update 2

ho capito. Nel caso in cui qualcun altro abbia questo problema. È necessario impostare il proprio nome di dominio come il Sito per la vostra applicazione:

In Admin o console django:

>>> my_site = Site.objects.get(pk=1) 
>>> my_site.domain = 'somedomain.com' 
>>> my_site.name = 'Some Domain' 
>>> my_site.save() 

L'altro problema per cui si potrebbe ottenere due e-mail quando il ripristino di esso, è perché che si può avere più nomi utente associati allo stesso indirizzo email. È piuttosto stupido. Questa è la prossima cosa che devo affrontare.

+3

penso si supponga di specificare il nome della vista invece del nome dell'URL. Qualcosa come '{% url 'django.contrib.auth.views.password_reset_confirm' ...%}' –

+0

Sì, ha funzionato. Strano, perché l'avevo copiato dalla documentazione di Django. Ora ci sono due problemi rimasti, per favore vedi la domanda aggiornata. Grazie – Houman

+0

Cesar, ho risolto gli altri due problemi e ho aggiornato la domanda. Se desideri inserire il tuo commento come risposta, selezionalo come risposta. Grazie – Houman

risposta

4

Quando si utilizza il tag modello url, è necessario specificare la vista e non l'URL stesso. Dal momento che si sta utilizzando 'django.contrib.auth.views.password_reset_confirm' nel vostro URLConf si dovrebbe usare in questo modo:

{% url 'django.contrib.auth.views.password_reset_confirm' ... %} 

Maggiori informazioni sul tag url modello sulla documentazione di Django Built-in template tags and filters.

0

Potrebbe essere una visualizzazione integrata, ma è comunque necessario un URL. Dovresti definirne uno in urls.py e collegarlo alla vista password_reset_confirm.

+0

Ho già definito un URL, vedi sopra .. (A meno che non ti abbia frainteso) La soluzione di Cesar funziona davvero. Ma ora non ci sono ancora del tutto. Ho appena aggiornato la domanda. Grazie – Houman

9

Per passare un URL al tag url modello, è possibile specificare un name per l'URL nella urls.py

url(r'^reset/(?P<uidb64>[0-9A-Za-z_\-]+)/(?P<token>[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/$', 
views.password_reset_confirm, name='password_reset_confirm'), 

e quindi è possibile utilizzare il tag con il nome dell'URL

{% url 'password_reset_confirm' uidb64=uid token=token %} 
0

Basta copiare questo URL sul tuo file urls.py principale, in modo che riconosca il nome dell'URL

url (r '^ reset/(? P [0-9A-Za-z _-] +)/(? P [0-9A-Za-z] {1,13} - [0-9A-Za- z] {1,20})/$', 'django.contrib.auth.views.password_reset_confirm', name = 'password_reset_confirm'),