Создаем страницу смены пароля пользователя в Django


03 января 2024


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

Смена пароля пользователя - это стандартная задача при создании сайта. В Django уже реализован функционал для смены пароля, который можно использовать. Кроме него можно создать собственный обработчик и форму для обработки задач по смене пароля. Как это можно сделать - будет рассмотрено ниже на примерах.

В примерах ниже используется стандартный проект, который можно создать через команды описанные ниже.

django-admin startproject testproject
cd .\testproject\
python manage.py migrate
python manage.py createsuperuser
python manage.py startapp app

Приложение 'app' создается, для второго примера, где вьюшка, для обработки смены пароля, создается самостоятельно. Оно так же добавлено в 'INSTALLED_APPS' в 'testproject/settings.py'.

INSTALLED_APPS = [
    ...
    'app.apps.AppConfig',
]

Так же, в корне проекта, создана папка для шаблонов 'templates' и она указана в 'testproject/settings.py'.

Указания пути для хранения шаблонов в Django

 

 

Создание страницы формы с использованием 'django.contrib.auth'

'django.contrib.auth' - это приложение, которое содержит обработчики с формами для регистрации пользователей, выполнения входа и выхода, а так же другими действиями связанными с пользователем и паролем. В нем так же есть вьюшки для обработки смены пароля. То есть мы можем использовать это приложение двумя способами.

Первый способ - использовать все возможности приложения указав его через 'include' в 'testproject/urls.py'.

from django.contrib import admin
from django.urls import path, include


urlpatterns = [
    path('admin/', admin.site.urls, name='admin'),
    path('', include('django.contrib.auth.urls'))
]

Добавление страниц аутентификации и авторизации в Django

Второй способ - использовать только те вьюшки, которые нам нужны. В нашем случае это 'PasswordChangeView', для смены пароля и 'PasswordChangeDoneView' для информирования об успешной смене пароля .

from django.contrib import admin
from django.urls import path
from django.contrib.auth import views as auth_views

urlpatterns = [
    path('admin/', admin.site.urls, name='admin'),
    path('password_change/',
         auth_views.PasswordChangeView.as_view(),
         name='password_change'),
    path('password_change_done/',
         auth_views.PasswordChangeDoneView.as_view(),
         name='password_change_done'),
]

Добавление страниц смены пароля в Django

Имена путей (параметр name) важно оставлять такими же т.к. за счет этого выполняется переадресация пользователя. Вы сможете изменить это через 'success_url', посмотрев на код ниже.

Создание шаблонов

Нам нужно создать два шаблона: первый для вывода формы, второй для информации об успешной смене пароля. Место хранения шаблонов, по умолчанию, а так же имя определено по умолчанию. Это 'registration/password_change_form.html' и 'registration/password_change_done.html' соответственно.

Если шаблон не будет найден в вашей директории, то Django возьмет свой, системный, шаблон.

Страница смены пароля в Django

Пример шаблона по смене пароля, по пути 'registration/password_change_form.html'.

<form method="post">
  {% csrf_token %}
  {{ form }}
  <button type="submit">Сохранить</button>
</form>

Шаблон смены пароля в Django

Так же шаблон, который говорит об успешной смене пароля 'registration/password_change_done.html'.

<p>Пароль сменен успешно.</p>

Страница успешной смены пароля в Django

Дополнительные возможности

Вы можете указать другой путь для шаблона в файле 'testproject/urls.py' использовав параметр 'template_name'.

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

from django.contrib import admin
from django.urls import path
from django.contrib.auth import views as auth_views
from django.urls import reverse_lazy

urlpatterns = [
    path('admin/', admin.site.urls, name='admin'),
    path('password_change/',
        auth_views.PasswordChangeView.as_view(
            template_name='password_change_form.html',
            success_url=reverse_lazy('admin:index'),
            ), name='password_change'),
]

Один из способов изменить язык - указать его в настройках проекта, в файле 'testproject/settings.py'.

Изменение языка системных форм в Django

LOGIN URL

Т.к. смена пароля действие, которое выполняется после аутентификации и авторизации, вы должны выполнить вход. Если этого не сделано и вы зайдете на страницу смены пароля, будет выполнена переадресация на следующий URL.

/accounts/login/?next=/password_change/

Ошибка с переадресацией для входа в Django

Что бы перезаписать путь, который используется для входа по умолчанию, нужно в  'testproject/settings.py' указать значение переменной 'LOGIN_URL'. В моем случае - это страница панели администрирования.

LOGIN_URL = 'admin:index'

Либо изменить адресацию подходящую под указанный URL. Пример с изменением пути панели администрирования.

from django.contrib import admin
from django.urls import path, include


urlpatterns = [
    path('accounts/', admin.site.urls, name='admin'),
    path('', include('django.contrib.auth.urls'))
]

 

Создание собственного обработчика

Во вьюшке 'PasswordChangeView', которая была показана выше, используется форма 'PasswordChangeForm'. Задачи этой формы - проверять пароли, сохранять их и выводить ошибки. Мы так же можем использовать эту форму для создания собственного представления.

В функции обработчике паролей так же рекомендуется использовать другую функцию - 'update_session_auth_hash()'. Задача этой функции в обновлении сессии после смены пароля. Без использования этой функции - пользователю потребуется выполнить вход еще раз.

from django.contrib import messages
from django.contrib.auth.forms import PasswordChangeForm
from django.contrib.auth import update_session_auth_hash
from django.shortcuts import render, redirect
from django.urls import reverse


def password_change(request):
    if request.method == 'POST':
        form = PasswordChangeForm(request.user, request.POST)
        if form.is_valid():
            user = form.save()
            update_session_auth_hash(request, user)
            messages.success(request, 'Пароль сменен успешно')
            return redirect(reverse('admin:index'))
    else:
        form = PasswordChangeForm(request.user)
    return render(request,
                  'registration/password_change_form.html',
                  {'form': form},
                )

Собственная вьюшка для смены пароля в Django

Маршрут в 'testproject/urls.py'.

from django.contrib import admin
from django.urls import path
from app.views import password_change

urlpatterns = [
    path('admin/', admin.site.urls),
    path('password_change/',
         password_change,
         name='password_change'),
]

Шаблон, через который можно вывести форму. Во вьюшке прописан следующий путь 'registration/password_change_form.html'.

<form method="post">
    {% csrf_token %}
    {{ form }}
    <button type="submit">Сохранить</button>
</form>

Изменить язык так же можно через 'settings.py'.

LANGUAGE_CODE = 'RU-ru'

Изменение языка в Django

...

Теги: #django #пароль #пользователь


Каналы
Telegram FixMyPc Telegram Лента FixMyPC RSS Rss
Популярные тэги
О блоге
Этот блог представляет собой конспекты выученного материала, приобретённого опыта и лучшие практики в системном администрировании и программировании.