RkBlog

Hardware, programming and astronomy tutorials and reviews.

Resetowanie zapomnianego hasła w Django 1.0

Widoki resetowania hasła i zasadach ich działania zmieniła się w Django 1.0, o czym trochę zapomniała dokumentacja. Najprostsze wykorzystanie widoków resetowania hasła to dodanie ich do urlconf:

import django.contrib.auth.views
....
(r'^password_reset/$', 'django.contrib.auth.views.password_reset'),
(r'^password_reset/done/$', 'django.contrib.auth.views.password_reset_done'),
(r'^reset/(?P<uidb36>[0-9A-Za-z]+)-(?P<token>.+)/$', 'django.contrib.auth.views.password_reset_confirm'),
(r'^reset/done/$', 'django.contrib.auth.views.password_reset_complete'),
Szablony znajdują się w django/contrib/admin/templates/registration i nadają się do użytku, lecz są w stylu panelu admina. Można podać ścieżki do własnych:
(r'^password_reset/$', 'django.contrib.auth.views.password_reset', {'template_name':'userpanel/password_reset_form.html', 'email_template_name':'userpanel/password_reset_email.html'}),
(r'^password_reset/done/$', 'django.contrib.auth.views.password_reset_done', {'template_name':'userpanel/password_reset_done.html'}),
(r'^reset/(?P<uidb36>[0-9A-Za-z]+)-(?P<token>.+)/$', 'django.contrib.auth.views.password_reset_confirm', {'template_name':'userpanel/password_reset_confirm.html'}),
(r'^reset/done/$', 'django.contrib.auth.views.password_reset_complete', {'template_name':'userpanel/password_reset_complete.html'}),
Problemy wystąpią, gdy mamy te widoki obudowane we własne widoki. Na starcie dostaniemy parę wyjątków NoReverseMatch: Reverse for 'yourapp.django.contrib.auth.views.password_reset_confirm' with arguments '()' and keyword arguments.... Do dwóch widoków i szablonu należy dodać post_reset_redirect zawierający URL do następnego widoku: Przykład:
def password_reset(request):
	"""
	django.contrib.auth.views.password_reset view (forgotten password)
	"""
	if not request.user.is_authenticated():
		return django.contrib.auth.views.password_reset(request,
                          template_name='userpanel/password_reset_form.html',
                          email_template_name= 'userpanel/password_reset_email.html',
                          post_reset_redirect='/user/password_reset/done/')
	else:
		return HttpResponseRedirect("/user/")
Nazwa domeny w treści emaila brana jest z aplikacji Sites (jak nie ma to pewnie bierze domenę strony) i jeżeli coś w Sites zmienimy to musimy zrestartować serwer by w mailach widoczna była ta zmiana.

RkBlog

Django, 26 September 2008, Piotr Maliński

Comment article