Мы успешно создали новую функцию регистрации, которая будет работать вместе с нашим существующим входом и выходом из системы. Не хватает только одного: добавить пользователям возможность сбрасывать свои пароли.
Нам нужна password_reset страница, на которой пользователь может ввести свой адрес электронной почты и получить криптографически защищенное электронное письмо с одноразовой ссылкой на страницу reset.
Если вы помните полный набор представлений и URL-адресов, предоставляемых auth приложением Django, уже есть несколько для сброса пароля:
accounts/login/ [name='login']
accounts/logout/ [name='logout']
accounts/password_change/ [name='password_change']
accounts/password_change/done/ [name='password_change_done']
accounts/password_reset/ [name='password_reset']
accounts/password_reset/done/ [name='password_reset_done']
accounts/reset/<uidb64>/<token>/ [name='password_reset_confirm']
accounts/reset/done/ [name='password_reset_complete']
Шаблон по умолчанию для сброса пароля находится по адресу templates/registration/password_reset_form.html Добавим в него следующий код:
{% extends "blog/base.html" %}
{% block title %}Forgot Your Password?{% endblock %}
{% block content %}
<h1>Forgot your password?</h1>
<p>Enter your email address below, and we'll email instructions for setting a new one.</p>
<form method="POST">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Send me instructions!">
</form>
{% endblock %}
Если вы обновите страницу, http://127.0.0.1:8000/accounts/password_reset/ вы увидите:
Также нам нужно создать шаблон password_reset_done.html с информацией об удачной отправке письма:
{% extends "blog/base.html" %}
{% block title %}Email Sent{% endblock %}
{% block content %}
<h1>Check your inbox.</h1>
<p>We've emailed you instructions for setting your password. You should receive the email shortly!</p>
{% endblock %}
Также создадим файл password_reset_confirm.html для смены пароля:
{% extends "blog/base.html" %}
{% block title %}Enter new password{% endblock %}
{% block content %}
{% if validlink %}
<h1>Set a new password!</h1>
<form method="POST">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Change my password">
</form>
{% else %}
<p>The password reset link was invalid, possibly because it has already been used. Please request a new password
reset.</p>
{% endif %}
{% endblock %}
После отправки вы будете перенаправлены на нашу последнюю страницу по умолчанию, предназначенную для завершения сброса пароля password_reset_complete.html:
{% extends "blog/base.html" %}
{% block title %}Password reset complete{% endblock %}
{% block content %}
<h1>Password reset complete</h1>
<p>Your new password has been set. You can log in now on the <a href="{% url 'login' %}">log in page</a>.</p>
{% endblock %}
А теперь об интересном, кто-нибудь обратил внимание на то, что при регистрации мы не вводили e-mail адрес? Поэтому на данном этапе наше восстановление пароля работать не будет, попробуем это исправить в следующем шаге.