Изменение пароля в профиле пользователя Django
Создадим форму изменения пароля в файле authenticated.py
modules/system/forms/authenticated.py
from django.contrib.auth.forms import SetPasswordForm
class UserPasswordChangeForm(SetPasswordForm):
"""
Форма изменения пароля
"""
def __init__(self, *args, **kwargs):
"""
Обновление стилей формы
"""
super().__init__(*args, **kwargs)
for field in self.fields:
self.fields[field].widget.attrs.update({
'class': 'form-control',
'autocomplete': 'off'
})
Пояснения:
- Наследуемся от уже встроенной формы в Django - SetPasswordForm
- Добавляем стили Bootstrap в форму
Теперь создадим представление в файле authenticated.py
modules/system/views/authenticated.py
from django.contrib.auth.views import PasswordChangeView
from modules.system.forms.authenticated import UserPasswordChangeForm
class UserPasswordChangeView(SuccessMessageMixin, PasswordChangeView):
"""
Изменение пароля пользователя
"""
form_class = UserPasswordChangeForm
template_name = 'modules/system/authenticated/password-change.html'
success_message = 'Ваш пароль был успешно изменён!'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['title'] = 'Изменение пароля на сайте'
return context
def get_success_url(self):
return reverse_lazy('profile', kwargs={'slug': self.request.user.profile.slug})
Пояснения:
- Импортируем PasswordChangeView и UserPasswordChangeForm
- Наследуемся от уже стандартного представления по смене пароля PasswordChangeView в Django 4.1
- Не забываем про миксин для уведомлений SuccessMessageMixin
- После успешной смены пароля, перенаправляем пользователя в его профиль.
Также нам необходимо добавить новое представление в urls.py:
from django.urls import path
from modules.system.views import ProfileView, ProfileEditView, RegisterCreateView, UserLoginView, UserPasswordChangeView
urlpatterns = [
path('user/edit/', ProfileEditView.as_view(), name='profile-edit'),
path('user/<str:slug>/', ProfileView.as_view(), name='profile'),
path('register/', RegisterCreateView.as_view(), name='register'),
path('login/', UserLoginView.as_view(), name='login'),
path('password-change/', UserPasswordChangeView.as_view(), name='password-change'),
]
Пояснения:
- Добавили password-change импортировав UserPasswordChangeView, задали название password-change.
Давайте теперь создадим шаблон для изменения:
templates/modules/system/authenticated/password-change.html
{% extends 'main.html' %}
{% block content %}
<div class="card mb-3 border-0 nth-shadow">
<div class="card-body">
<div class="card-title nth-card-title">
<h4>Изменение пароля на сайте</h4>
</div>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit" class="btn btn-dark mt-2">Подтвердить изменение пароля</button>
</form>
</div>
</div>
{% endblock %}
Пояснения:
- Простая POST форма, с Bootstrap стилями.
Давайте проверим форму изменения пароля:
Переходим на страницу http://127.0.0.1:8000/s/password-change/ под авторизованным пользователем, и видим следующее:

После успешной смены пароля на сайте:

Таким образом, мы создали форму изменения пароля. В следующем уроке побольше мы коснёмся восстановления пароля, так как там уже необходимо провести настройки для email отправки.