Функция смены пароля в Django

Блог Полезное

Функция смены пароля в Django

Функция смены пароля в Django

Попробую быстро описать, как сделать функцию смены пароля в Django с помощью встроенной формы PasswordChangeForm. Изменить пароль легче всего функцией, которую я опишу ниже.

Задачи:


  1. Написать функцию смены пароля

  2. Создать шаблон смены пароля

  3. Сделать роутинг

Напишите следующий код в views.py


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

def password_edit(request):
if request.method == 'POST':
form = PasswordChangeForm(request.user, request.POST)
if form.is_valid():
user = form.save()
update_session_auth_hash(request, user) # Important!
return redirect('password_edit')
else:
form = PasswordChangeForm(request.user)
else:
form = PasswordChangeForm(request.user)
return render(request, 'password_edit.html', {
'form': form
})

Импортируем форму PasswordChangeForm, проверяем метод запроса, если POST, то проверяем форму, если valid, то сохраняем форму, обновляем сессию и возвращаем пользователя на любую указанную страницу, в моем случае обратно на страницу смены пароля.

Создаем шаблон password_edit.html


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

 

Тут все понятно. Теперь в url.py 



urlpatterns = [
url(r'^edit/$', views.password_edit, name='password_edit'),
]

Это все, что нужно для работы. как видите ничего сложного. Я бы рекомендовал добавить уведомления пользователю при успешной смене и не успешной. 

Добавьте в views.py


from django.contrib import messages

def password_edit(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('password_edit')
else:
messages.error(request, 'Исправьте ошибки!')
else:
form = PasswordChangeForm(request.user)
return render(request, 'password_edit.html', {
'form': form
})