Django База [2023]: Форма изменения пароля в профиле #21
Данный урок посвящен изменению пароля на странице профиля пользователя. В нем мы создадим форму, необходимое представление и шаблон, а также проверим функционал в работе.
Если вы хотите выразить благодарность автору сайта, статей и курса по Django, вы можете сделать это по ссылке ниже:
Материалы, которые стоит прочесть до этой статьи:
- Система профилей Django (часть 1) - модель, сигналы.
- Система профилей Django (часть 2) - формы, представления.
- Создание формы и представления для авторизации и регистрации.
Создание формы изменения пароля
Перейдем к созданию формы для изменения пароля, для этого в нашем приложении system в файле forms.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 по необходимости.
Создание представления изменения пароля
from django.contrib.messages.views import SuccessMessageMixin
from django.contrib.auth.views import PasswordChangeView
from django.urls import reverse_lazy
from .forms import UserPasswordChangeForm
class UserPasswordChangeView(SuccessMessageMixin, PasswordChangeView):
"""
Изменение пароля пользователя
"""
form_class = UserPasswordChangeForm
template_name = 'system/user_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_detail', kwargs={'slug': self.request.user.profile.slug})
В данном фрагменте кода мы наследуемся от существующего класса PasswordChangeView, добавляем миксин для успешного уведомления, а также настраиваем reverse_lazy()
для успешного возврата на свою страницу при изменении профиля.
Добавляем представление в urls.py
Далее нам необходимо обработать представление. Для этого в наш файл urls.py приложения system добавим следующую строку:
from django.urls import path
from .views import ProfileUpdateView, ProfileDetailView, UserRegisterView, UserLoginView, UserPasswordChangeView
urlpatterns = [
path('user/edit/', ProfileUpdateView.as_view(), name='profile_edit'),
path('user/<str:slug>/', ProfileDetailView.as_view(), name='profile_detail'),
path('register/', UserRegisterView.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/system создаем файл user_password_change.html в котором добавляем следующую HTML разметку:
{% extends 'main.html' %}
{% block content %}
<div class="card mb-3 border-0 nth-shadow">
<div class="card-body">
<div class="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 %}
Проверяем в работе
Переходим на страницу будучи авторизованным пользователем: http://127.0.0.1:8000/password-change/
Отлично, мы изменили пароль и все работает так, как нам необходимо.