Класс PasswordResetView

Класс PasswordResetView применяется для создания страницы восстановления пароля. Он наследуется от встроенного представления Django и автоматически обрабатывает отправку письма со ссылкой для сброса пароля. В качестве аргументов можно указать шаблон формы, email-тему, и другие настройки. По умолчанию представление использует шаблон 'registration/password_reset_form.html'.

Синтаксис

pythonfrom django.contrib.auth.views import PasswordResetView

PasswordResetView.as_view(
  template_name='registration/password_reset_form.html',
  email_template_name='registration/password_reset_email.html',
  subject_template_name='registration/password_reset_subject.txt',
  success_url='/login/',
  from_email='admin@example.com',
  html_email_template_name=None,
  extra_email_context=None
)

Пример . Использование в urls.py

Давайте создадим URL-маршрут для восстановления пароля с использованием PasswordResetView:

pythonfrom django.urls import path
from django.contrib.auth.views import PasswordResetView
from django.contrib.auth.views import PasswordResetDoneView
from django.contrib.auth.views import PasswordResetConfirmView
from django.contrib.auth.views import PasswordResetCompleteView

urlpatterns = [
  path('password-reset/',
    PasswordResetView.as_view(
      template_name='registration/password_reset_form.html',
      email_template_name='registration/password_reset_email.html',
      subject_template_name='registration/password_reset_subject.txt',
      success_url='/password-reset/done/'
    ),
    name='password_reset'
  ),
  path('password-reset/done/',
    PasswordResetDoneView.as_view(),
    name='password_reset_done'
  ),
  path('reset/<uidb64>/<token>/',
    PasswordResetConfirmView.as_view(),
    name='password_reset_confirm'
  ),
  path('reset/done/',
    PasswordResetCompleteView.as_view(),
    name='password_reset_complete'
  ),
]

Пример . Кастомный шаблон

Создадим собственный шаблон для формы восстановления пароля в файле 'registration/password_reset_form.html':

html{% extends "base.html" %}

{% block content %}
  <h2>Восстановление пароля</h2>
  <form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">Отправить</button>
  </form>
{% endblock %}

Пример . Шаблон письма

Создадим шаблон для email-письма со ссылкой на сброс пароля в файле 'registration/password_reset_email.html':

html{% autoescape off %}
  Здравствуйте,
  
  Вы получили это письмо, потому что запросили
  восстановление пароля для аккаунта на сайте.
  
  Пожалуйста, перейдите по ссылке ниже и
  установите новый пароль:
  
  {{ protocol }}://{{ domain }}{% url 'password_reset_confirm' uidb64=uid token=token %}
  
  Ваше имя пользователя: {{ user.get_username }}
  
  Спасибо за использование нашего сайта!
{% endautoescape %}

Пример . Кастомизация представления

Давайте создадим собственное представление, наследуясь от PasswordResetView, для добавления дополнительной логики:

pythonfrom django.contrib.auth.views import PasswordResetView
from django.urls import reverse_lazy
from django.contrib import messages

class CustomPasswordResetView(PasswordResetView):
  template_name = 'custom/password_reset.html'
  email_template_name = 'custom/password_reset_email.html'
  subject_template_name = 'custom/password_reset_subject.txt'
  success_url = reverse_lazy('password_reset_done')
  from_email = 'noreply@mysite.com'
  
  def form_valid(self, form):
    email = form.cleaned_data['email']
    messages.success(
      self.request,
      f'Ссылка для сброса пароля отправлена на {email}'
    )
    return super().form_valid(form)

Результат выполнения кода:

python"Ссылка для сброса пароля отправлена на user@example.com"

Пример . Использование с кастомной моделью пользователя

Если вы используете кастомную модель пользователя, убедитесь, что она содержит поле для email:

pythonfrom django.contrib.auth.models import AbstractUser
from django.db import models

class CustomUser(AbstractUser):
  email = models.EmailField(unique=True)
  phone = models.CharField(max_length=15, blank=True)
  
  def __str__(self):
    return self.email

Смотрите также

  • класс LoginView,
    который обрабатывает вход пользователя в систему
  • класс LogoutView,
    который обрабатывает выход пользователя из системы
  • класс PasswordChangeView,
    который позволяет изменить пароль авторизованного пользователя
  • класс PasswordResetConfirmView,
    который подтверждает и устанавливает новый пароль