Класс PasswordChangeView

Класс PasswordChangeView из встроенного модуля django.contrib.auth.views предназначен для обработки смены пароля аутентифицированным пользователем. Он отображает форму для ввода старого и нового пароля, проверяет корректность старого пароля и сохраняет новый. После успешного изменения пароля выполняется перенаправление на страницу успеха, по умолчанию это PasswordChangeDoneView. При использовании этого класса сессия пользователя обновляется автоматически, чтобы предотвратить принудительный выход после смены пароля.

Синтаксис

pythonfrom django.contrib.auth.views import PasswordChangeView
from django.urls import path
from django.contrib.auth import views as auth_views

urlpatterns = [
    path('change-password/', PasswordChangeView.as_view(), name='password_change'),
    path('change-password/done/', PasswordChangeDoneView.as_view(), name='password_change_done'),
]

Параметры класса

Класс PasswordChangeView наследуется от FormView и принимает следующие параметры:

Пример . С настройкой URL

Давайте настроим маршруты для изменения пароля в файле urls.py:

pythonfrom django.urls import path
from django.contrib.auth import views as auth_views

urlpatterns = [
    path('accounts/password-change/',
        auth_views.PasswordChangeView.as_view(
            template_name='registration/password_change.html',
            success_url='/accounts/password-change/done/'
        ),
        name='password_change'),
    path('accounts/password-change/done/',
        auth_views.PasswordChangeDoneView.as_view(
            template_name='registration/password_change_done.html'
        ),
        name='password_change_done'),
]

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

Шаблон для отображения формы изменения пароля:

ninja{% extends "base.html" %}

{% block content %}
  <h2>Change Password</h2>
  <form method="post">
      {% csrf_token %}
      {{ form.as_p }}
      <button type="submit">Change Password</button>
  </form>
{% endblock %}

Пример . С кастомизацией формы

Давайте создадим собственную форму изменения пароля с дополнительными полями:

pythonfrom django import forms
from django.contrib.auth.forms import PasswordChangeForm

class CustomPasswordChangeForm(PasswordChangeForm):
    new_password_confirm = forms.CharField(
        label='Confirm New Password',
        widget=forms.PasswordInput
    )

    def clean(self):
        cleaned_data = super().clean()
        new_password = cleaned_data.get('new_password1')
        new_password_confirm = cleaned_data.get('new_password_confirm')
        if new_password and new_password_confirm and new_password != new_password_confirm:
            self.add_error('new_password_confirm', 'Passwords do not match')
        return cleaned_data

Теперь используем кастомную форму в PasswordChangeView:

pythonfrom django.urls import path
from django.contrib.auth.views import PasswordChangeView
from .forms import CustomPasswordChangeForm

urlpatterns = [
    path('change-password/',
        PasswordChangeView.as_view(
            form_class=CustomPasswordChangeForm,
            template_name='registration/custom_password_change.html',
            success_url='/accounts/profile/'
        ),
        name='custom_password_change'),
]

Пример . Обработка успешной смены

После успешной смены пароля Django автоматически обновляет сессию пользователя. Для демонстрации этого можно использовать сигналы или переопределить метод:

pythonfrom django.contrib.auth.views import PasswordChangeView
from django.contrib.auth import update_session_auth_hash
from django.contrib import messages

class CustomPasswordChangeView(PasswordChangeView):
    template_name = 'registration/password_change.html'
    success_url = '/accounts/profile/'

    def form_valid(self, form):
        messages.success(self.request, 'Your password was successfully updated!')
        user = form.save()
        update_session_auth_hash(self.request, user)
        return super().form_valid(form)

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

Шаблон для страницы успешной смены пароля:

ninja{% extends "base.html" %}

{% block content %}
  <div class="alert alert-success">
      <h2>Password Changed Successfully!</h2>
      <p>Your password has been updated. You can now continue using the site.</p>
      <a href="{% url 'profile' %}" class="btn btn-primary">Go to Profile</a>
  </div>
{% endblock %}

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

  • класс PasswordChangeDoneView,
    который отображает страницу успешного изменения пароля
  • класс LoginView,
    который обрабатывает аутентификацию пользователя
  • метод set_password,
    который устанавливает новый пароль для пользователя
  • метод update_session_auth_hash,
    который обновляет сессию после смены пароля