Django База [2023]: Форма изменения пароля в профиле #21
Django

Django База [2023]: Форма изменения пароля в профиле #21

Razilator

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

Материалы, которые стоит прочесть до этой статьи:

Создание формы изменения пароля

Перейдем к созданию формы для изменения пароля, для этого в нашем приложении system в файле forms.py после существующих форм создадим новую:

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 по необходимости.

Создание представления изменения пароля

system/views.py
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 добавим следующую строку:

system/urls.py
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 разметку:

templates/system/user_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">
                <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/

Изменяем пароль
Изменяем пароль
Сохраняем пароль
Сохраняем пароль

Отлично, мы изменили пароль и все работает так, как нам необходимо.

;