Класс PasswordResetConfirmView
Класс PasswordResetConfirmView предназначен для обработки перехода пользователя по ссылке, полученной после запроса на сброс пароля. Данная ссылка содержит токен, позволяющий идентифицировать конкретного пользователя и создать форму для ввода нового пароля. В случае успешной валидации и сохранения нового пароля, пользователь перенаправляется на страницу успешного завершения процедуры. Класс входит в состав модуля django.contrib.auth.views.
Основными параметрами класса являются template_name (шаблон для отображения формы ввода нового пароля), form_class (класс формы для установки нового пароля), success_url (URL для перенаправления после успешной смены пароля), title (заголовок страницы), token_generator (генератор токенов для проверки ссылки) и post_reset_login (автоматический вход после сброса пароля).
Синтаксис
from django.urls import path
from django.contrib.auth.views import PasswordResetConfirmView
urlpatterns = [
path(
'reset/<uidb64>/<token>/',
PasswordResetConfirmView.as_view(
template_name='registration/password_reset_confirm.html',
success_url='/accounts/login/',
post_reset_login=True
),
name='password_reset_confirm'
),
]
Настройка URL
Для работы представления необходимо передать в URL два параметра: uidb64 (закодированный идентификатор пользователя) и token (уникальный токен для проверки подлинности ссылки). Эти параметры генерируются представлением PasswordResetView при отправке письма:
from django.urls import path
from django.contrib.auth.views import PasswordResetConfirmView
urlpatterns = [
path(
'reset/<uidb64>/<token>/',
PasswordResetConfirmView.as_view(
template_name='registration/password_reset_confirm.html'
),
name='password_reset_confirm'
),
]
Создание шаблона
Шаблон для ввода нового пароля должен содержать форму с полями new_password1 и new_password2, а также скрытое поле csrf_token для защиты от межсайтовой подделки запроса. Пример шаблона password_reset_confirm.html:
{% extends "base.html" %}
{% block content %}
<h2>Введите новый пароль</h2>
{% if validlink %}
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Сменить пароль</button>
</form>
{% else %}
<p>Ссылка для сброса пароля недействительна.</p>
{% endif %}
{% endblock %}
Переменная validlink указывает на то, действительна ли ссылка для сброса пароля. Если она равна False, следует показать сообщение об ошибке.
Настройка автоматического входа
Класс позволяет автоматически выполнить вход пользователя после успешной смены пароля с помощью параметра post_reset_login. Дополнительно можно указать бекенд аутентификации через параметр post_reset_login_backend:
from django.urls import path
from django.contrib.auth.views import PasswordResetConfirmView
urlpatterns = [
path(
'reset/<uidb64>/<token>/',
PasswordResetConfirmView.as_view(
post_reset_login=True,
post_reset_login_backend='django.contrib.auth.backends.ModelBackend'
),
name='password_reset_confirm'
),
]
Полный пример использования
Рассмотрим полный пример настройки представления со всеми параметрами:
from django.urls import path
from django.contrib.auth.views import PasswordResetConfirmView
from django.contrib.auth.forms import SetPasswordForm
urlpatterns = [
path(
'reset/<uidb64>/<token>/',
PasswordResetConfirmView.as_view(
template_name='registration/password_reset_confirm.html',
form_class=SetPasswordForm,
success_url='/accounts/login/',
title='Введите новый пароль',
post_reset_login=True,
post_reset_login_backend='django.contrib.auth.backends.ModelBackend'
),
name='password_reset_confirm'
),
]
Пример . Обработка в шаблоне
Пример обработки формы с выводом ошибок валидации в шаблоне:
{% extends "base.html" %}
{% block content %}
<h2>{{ title }}</h2>
{% if validlink %}
<form method="post">
{% csrf_token %}
<div>
{{ form.new_password1.errors }}
<label for="id_new_password1">Новый пароль:</label>
{{ form.new_password1 }}
</div>
<div>
{{ form.new_password2.errors }}
<label for="id_new_password2">Подтверждение пароля:</label>
{{ form.new_password2 }}
</div>
<button type="submit">Сменить пароль</button>
</form>
{% else %}
<p>Ссылка для сброса пароля недействительна или устарела.</p>
{% endif %}
{% endblock %}
Результат отображения страницы при успешном переходе по ссылке:
"Форма для ввода нового пароля отображается"
Результат при переходе по недействительной ссылке:
"Ссылка для сброса пароля недействительна или устарела."
Смотрите также
-
класс
PasswordResetView,
который инициирует процесс сброса пароля -
класс
PasswordResetDoneView,
который отображается после отправки письма со ссылкой -
класс
PasswordResetCompleteView,
который отображается после успешного сброса пароля -
класс
PasswordChangeView,
который позволяет сменить пароль авторизованному пользователю