Смена пароля пользователя - это стандартная задача при создании сайта. В 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.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'))
]
Второй способ - использовать только те вьюшки, которые нам нужны. В нашем случае это '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'),
]
Имена путей (параметр name) важно оставлять такими же т.к. за счет этого выполняется переадресация пользователя. Вы сможете изменить это через 'success_url', посмотрев на код ниже.
Создание шаблонов
Нам нужно создать два шаблона: первый для вывода формы, второй для информации об успешной смене пароля. Место хранения шаблонов, по умолчанию, а так же имя определено по умолчанию. Это 'registration/password_change_form.html' и 'registration/password_change_done.html' соответственно.
Если шаблон не будет найден в вашей директории, то Django возьмет свой, системный, шаблон.
Пример шаблона по смене пароля, по пути 'registration/password_change_form.html'.
<form method="post">
{% csrf_token %}
{{ form }}
<button type="submit">Сохранить</button>
</form>
Так же шаблон, который говорит об успешной смене пароля 'registration/password_change_done.html'.
<p>Пароль сменен успешно.</p>
Дополнительные возможности
Вы можете указать другой путь для шаблона в файле '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'.
Т.к. смена пароля действие, которое выполняется после аутентификации и авторизации, вы должны выполнить вход. Если этого не сделано и вы зайдете на страницу смены пароля, будет выполнена переадресация на следующий URL.
/accounts/login/?next=/password_change/
Что бы перезаписать путь, который используется для входа по умолчанию, нужно в '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},
)
Маршрут в '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'
...
Подписывайтесь на наш Telegram канал
Теги: #django #пароль #пользователь