Класс 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,
который обновляет сессию после смены пароля