Django账户管理部分——密码修改与重置

要点:修改密码,使用邮箱重置密码
上期文章:用户登录与注册
视频:这个看看就行


修改密码

一般密码修改流程为用户点击修改密码后跳转到密码修改页面,在修改页面中输入旧密码和新密码,若用户旧密码通过验证,则用新密码替换旧密码并保存至数据库。

Django内置了密码修改的方法,我们可以用其内置的方法完成此修改密码的操做。

Django提供的修改密码的方法是基于类的视图,我们不必再views.py中编写程序了,下面为具体步骤。

  • 编写account下的urls.py:
urlpatterns = [
    ……
    path('password-change/',auth_views.PasswordChangeView.as_view(
    						template_name="account/password_change_form.html"
        					success_url="/account/password-change-done/"),
         					name='password_change')
    path('pasword-change-done/',auth_views.PasswordChangeDoneView.as_view(
    							template_name="account/password_change_done.html"),
        						name='password_change_done')
]

在第一个路径 ’password-change/‘中使用了auth_views.PasswordChangeView.as_view()方法,其中参数

  • template_name为用户提交修改密码请求时跳转的页面,即用户要填写新旧密码的页面。

  • success_url为当用户完成密码修改时跳转的链接,用户完成密码修改时,将会跳转到一个页面,在这个页面提醒用户密码修改操作已完成。

第二个路径’password-change-done/‘中,auth_views.PasswordChangeDoneView.as_view()时配置完成密码修改后跳转的页面。

  • 编写模板文件

    根据路径编写规则,我们需要编写两个模板文件。

    在templates文件里的account文件中新建password_change_form.html文件:

    {% extends "base.html" %}
    {% load staticfiles %}
    {% block title %}密码修改{% endblock %}
    {% block content %}
    

    密码修改

    {% if form.new_password1.help_text %}

    {{ form.new_password1.help_text|safe }}

    {% endif %}
    {% if next %}
    {% else %} {% endif %} {% csrf_token %}
    {{ form.old_password }}
    {{ form.new_password1 }}
    {{ form.new_password2 }}
    {% endblock %}

    一般只有在用户已登录的状态下才能修改密码,所以在用户进行修改密码操作之前需要先判断用户是否已登陆。

    password_change_form.html中,修改表单提交地址:

    {% if next %}
    
    {% else %} {% endif %}

    {% if next %}{% else %}{% endif %}等是模板语句的条件判断语句。
    此外还要在settings.py中添加登陆页面链接地址:

    LOGIN_URL = '/account/login/'
    

    密码修改完成的页面就很简单了,在templates文件里的account文件中新建password_change_done.html文件:

    {% extends "base.html" %}
    {% load staticfiles %}
    {% block title %}密码修改完成{% endblock %}
    {% block content %}
    
    密码修改完成,点击返回登陆页面
    {% endblock %}

密码重置

当用户忘记密码时,需要重置密码。Django也提供了一个基于类的视图方法帮助用户使用邮箱重置密码,下面时重置密码的基本步骤:

  • 用户填写注册时的邮箱
  • 后台会把一个链接发送至该邮箱
  • 用户点击该链接跳转到填写新密码的页面。
  • 用户提交新密码后原有密码会被修改。

下面编写urls.py

urlpatterns=[
    ……
    path('password-reset/', auth_views.PasswordResetView.as_view(
        template_name='account/password_reset_form.html',
        email_template_name='account/password_reset_email.html',
        success_url='/account/password-reset-done/'),
         name="password_reset"),
    path('password-reset-done/', auth_views.PasswordResetDoneView.as_view(
        template_name='account/password_reset_done.html'),
         name="password_reset_done"),
]
  • 第一个passowrd-reset/路径,使用了PasswordResetView视图类,其中三个参数:

template_name='account/password_reset_form.html'定义了该路径对应的模板页面,即用户填写邮箱的页面。

email_template_name='account/password_reset_email.html'定义了向用户邮箱发送的内容。

success_url='/account/password-reset-done/')定义了发送完邮箱后跳转的链接,需注意链接书写的格式。

  • password-reset-done/路径是定义邮箱送完成后的模板页面,使用了PasswordResetDoneView视图类,

    template_name='account/password_reset_done.html'是对应的模板页面。

下面就是根据url编写模板页面了。

templates文件下的account文件夹中新建password_reset_form.html

{% extends "base.html" %}
{% load staticfiles %}
{% block title %}找回密码{% endblock %}
{% block content %}

找回密码

{% csrf_token %}
{{ form.email }}
{% endblock %}

文件很简单,就是一个让用户填写邮箱的表单。

编写password_reset_email.html:

{{ user.username }}

,你好,你之所以收到这封邮件,是因为你正在进行重置密码操作, 重置密码点击{{ protocol }}://{{ domain }}{% url "account:password_reset_confirm" uidb64=uid token=token %}

这就是我们要像用户邮箱发送的内容。

当用户邮箱填写完成后需要提醒用户,编写password_reset_done.html:

{% extends "base.html" %}
{% load staticfiles %}
{% block title %}邮件发送完成{% endblock %}
{% block content %}

邮件已发送至你的邮箱,稍后将会收到密码重置链接

{% endblock %}

我们发送至用户邮箱的内容中有一条链接,这是让用户填写新密码的,下面配置这条链接,编写urls.py:

urlptterns=[
    ……
     path('password-reset-confirm///',    						        		auth_views.PasswordResetConfirmView.as_view(
        template_name="account/password_reset_confirm.html",
        success_url="/account/password-reset-complete/"),
         name='password_reset_confirm'),
    path('password-reset-complete/', auth_views.PasswordResetCompleteView.as_view(
        template_name="account/password_reset_complete.html"),
         name="password_reset_complete")
    
]
  • password-reset-confirm///路径使用了PasswordResetConfirmView视图类,参数

template_name="account/password_reset_confirm.html是用户填写新密码的页面,

success_url="/account/password-reset-complete/")使用户重置密码完成后跳转的页面链接。

新建account/password_reset_confirm.html

{% extends "base.html" %}
{% load staticfiles %}
{% block title %}密码重置验证{% endblock %}
{% block content %}
{% csrf_token %}
{{ form.new_password1 }}
{{ form.new_password2 }}
{% endblock %}
  • 路径password-reset-complete使用了PasswordResetCompleteView类:参数

    template_name="account/password_reset_complete.html"使用户完成操作后跳转的页面。

    新建password_reset_complete.html

    {% extends "base.html" %}
    {% load staticfiles %}
    {% block title %}密码重置完成{% endblock %}
    {% block content %}
    

    密码已重置,点击返回登录页面

    {% endblock %}

至此,密码重置的基本一完成,但还需要设置一下邮箱,即用哪个邮箱向用户发送邮件,编写settings.py:

EMAIL_HOST = 'smtp.163.com'
EMAIL_HOST_USER = "[email protected]"
EMAIL_HOST_PASSWORD = "**********"
EMAIL_PORT = 25
EMAIL_USE_TLS = True
DEFAULT_FROM_EMAIL = "[email protected]"

注意以上设置需要你的邮箱开启相关(smtp,imap,pop等)服务,不同邮箱需要不同设置。

你可能感兴趣的:(Django账户管理部分——密码修改与重置)