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

Добавьте новые URL-шаблоны восстановления паролей в файле urls.py приложения account:

# restore password urls
url(r'^password-reset/$', 'django.contrib.auth.views.password_reset', name='password_reset'),
url(r'^password-reset/done/$', 'django.contrib.auth.views.password_reset_done', name='password_reset_done'),
url(r'^password-reset/confirm/(?P<uidb64>[-\w]+)/(?P<token>[-\w]+)/$', 'django.contrib.auth.views.password_reset_confirm', name='password_reset_confirm'),
url(r'^password-reset/complete/$', 'django.contrib.auth.views.password_reset_complete', name='password_reset_complete'),

Добавьте новый шаблон в директорию templates/registration/ приложения account и назовите его password_reset_form.html . Добавьте в него следующий код:

{% extends "base.html" %}

{% block title %}Reset your password{% endblock %}

{% block content %}
    <h1>Forgotten your password?</h1>
    <p>Enter your e-mail address to obtain a new password.</p>
    <form action="." method="post">
        {{ form.as_p }}
        <p><input type="submit" value="Send e-mail"></p>
        {% csrf_token %}
    </form>
{% endblock %}

Добавьте еще один файл в ту же директоию и назовите его password_reset_email.html . Добавьте в него следующий код:

Someone asked for password reset for email {{ email }}. Follow thelink below:
{{ protocol }}://{{ domain }}{% url "password_reset_confirm" uidb64=uid token=token %}
Your username, in case you've forgotten: {{ user.get_username }}

Это шаблон сообщения отправляемое пользователю по email для смены пароля.

Добавьте еще один шаблон в директорию templates/registration/ приложения account и назовите его password_reset_done.html . Добавьте в него следующий код:

{% extends "base.html" %}

{% block title %}Reset your password{% endblock %}

{% block content %}
    <h1>Reset your password</h1>
    <p>We've emailed you instructions for setting your password.</p>
    <p>If you don't receive an email, please make sure you've entered the address you registered with.</p>
{% endblock %}

Добавьте еще один шаблон в директорию templates/registration/ приложения account и назовите его password_reset_confirm.html . Добавьте в него следующий код:

{% extends "base.html" %}

{% block title %}Reset your password{% endblock %}

{% block content %}
    <h1>Reset your password</h1>
    {% if validlink %}
        <p>Please enter your new password twice:</p>
        <form action="." method="post">
            {{ form.as_p }}
            {% csrf_token %}
            <p><input type="submit" value="Change my password"/></p>
        </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 %}

Мы проверяем валидность предоставленной ссылки. В представлении reset password эта переменная устанавливается и помещается в контекст данного шаблона. Если ссылка валидна, отображается форма сброса пароля пользователя.

Добавьте еще один шаблон в директорию templates/registration/ приложения account и назовите его password_reset_complete.html . Добавьте в него следующий код:

{% extends "base.html" %}

{% block title %}Password reset{% endblock %}

{% block content %}
    <h1>Password set</h1>
    <p>Your password has been set. You can <a href="{% url "login" %}">log in now</a></p>
{% endblock %}

Теперь отредактируйте шаблон registration/login.html приложения account. И добавьте в него код, сразу после элемента <form>:

<p><a href="{% url "password_reset" %}">Forgotten your password?</a></p>

Откройте в браузере страницу http://127.0.0.1:8000/account/login/ . И нажмите на кнопку Forgotten your password? Вы увидите следующую страницу:

На этом этапе необходимо добавить конфигурацию SMTP в файл settings.py проекта, чтобы Джанго мог отправлять сообщения электронной почты. Мы видели, как добавить в проект параметры электронной почты в главе 2. Однако можно настроить Джанго для записи сообщений в стандартный выходной файл вместо отправки их через SMTP-сервер. Отредактируйте файл settings.py и добавьте в него следующую строку:

EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'

Параметр EMAIL_BACKEND указывает класс, используемый для отправки email-ов.

Вернитесь в браузер, введите адрес электронной почты существующего пользователя и нажмите кнопку Send e-mail. Вы увидите следующую страницу:

Посмотрите на консоль, где работает сервер разработки. Полученное сообщение будет показано следующим образом:

IME-Version: 1.0
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: 7bit
Subject: Password reset on 127.0.0.1:8000
From: webmaster@localhost
To: [email protected]
Date: Thu, 24 Sep 2015 14:35:08 -0000
Message-ID: <[email protected]>
Someone asked for password reset for email [email protected]. Follow the
link below:
http://127.0.0.1:8000/account/password-reset/confirm/MQ/45f-
9c3f30caafd523055fcc/
Your username, in case you've forgotten: zenx

Электронная почта обрабатывается с помощью созданного ранее шаблона password_reset_email.html. URL-адрес для сброса пароля включает token, который был создан динамически с помощью Джанго. Откройте ссылку в браузере. Вы увидите следующую страницу:

Страница для установки нового пароля соответствует шаблону password_reset_confirm.html. Введите новый пароль и нажмите кнопку Change my password. Джанго создает новый зашифрованный пароль и сохраняет его в базе данных. Вы увидите страницу с сообщением об удачной смене пароля:

Теперь вы можете войти в свою учетную запись с помощью нового пароля. Каждый token для установки нового пароля может использоваться только один раз.

В проекте были интегрированы представления Django authentication framework. Эти представления подходят для большинства случаев. Однако можно создавать собственные представления, если требуется другое поведение.

results matching ""

    No results matching ""