РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
575 of 818 menu

Класс PasswordChangeView

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

Синтаксис

from 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 и принимает следующие параметры:

  • template_name - шаблон для отображения формы (по умолчанию 'registration/password_change_form.html')
  • success_url - URL для перенаправления после успешной смены пароля (по умолчанию 'password_change_done')
  • form_class - класс формы для изменения пароля (по умолчанию PasswordChangeForm)
  • title - заголовок страницы (по умолчанию 'Password change')

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

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

from 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'), ]

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

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

{% 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 %}

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

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

from 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:

from 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 автоматически обновляет сессию пользователя. Для демонстрации этого можно использовать сигналы или переопределить метод:

from 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)

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

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

{% 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,
    который обновляет сессию после смены пароля
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить