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

本文介绍了Django中如何实现用户密码的修改和重置功能。密码修改利用Django内置的类视图,通过设置urls.py、模板文件及验证流程来完成。密码重置涉及用户邮箱验证,包括填写邮箱、发送验证链接、设置新密码等步骤,同样使用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 %}
    <div class="row text-center">
    <div>
    <h1>密码修改</h1>
        {% if form.new_password1.help_text %}
        <p class="text-center">{{ form.new_password1.help_text|safe }}</p>
        {% endif %}
    </div>
        {% if next %}
    <form action="{% url 'account:login' %}?next={{ next }}" method="post" class="form-horizontal">
        {% else %}
        <form action="{% url 'account:login' %}" method="post" class="form-horizontal">
            {% endif %}
        {% csrf_token %}
        <div class="form-group">
            <label for="old-password">旧密码:</label>
            {{ form.old_password }}
        </div>
        <div class="form-group">
            <label for="new-password1">新密码:</label>
            {{ form.new_password1 }}
        </div>
        <div class="form-group">
            <label for="new-password2">确认密码:</label>
            {{ form.new_password2 }}
        </div>
        <input type="submit" value="提交" class="btn btn-lg btn-primary "/>
    </form>
    </div>
    {% endblock %}
    

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

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

    {% if next %}
    <form action="{% url 'account:login' %}?next={{ next }}" method="post" class="form-horizontal">
    {% else %}
    <form action="{% url 'account:login' %}" method="post" class="form-horizontal">
    {% 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 %}
    <div class="text-center">
        密码修改完成,点击返回<a href="{% url 'account:login' %}">登陆页面</a>
    </div>
    {% 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 %}
<div class="row text-center">
<h1>找回密码</h1>
<form action="." method="post" class="form-horizontal">
    {% csrf_token %}
    <div class="form-group">
        <label for="email">邮箱:</label>
        {{ form.email }}
    </div>
    <input type="submit" value="发送邮件" class="btn btn-primary btn-lg"/>
</form>
</div>
{% endblock %}

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

编写password_reset_email.html:

<p>{{ user.username }}</p>,你好,你之所以收到这封邮件,是因为你正在进行重置密码操作,
重置密码点击{{ 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 %}
<p class="text-center">邮件已发送至你的邮箱,稍后将会收到密码重置链接</p>
{% endblock %}

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

urlptterns=[
    ……
     path('password-reset-confirm/<uidb64>/<token>/',    						        		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 %}
<div class="row" class="text-center">
<form action="." method="post" class="form-horizontal">
    {% csrf_token %}
    <div class="form-group">
    <label for="new_password1">新密码:</label>
    {{ form.new_password1 }}
    </div>
    <div class="form-group">
        <label for="new_password2">确认密码:</label>
        {{ form.new_password2 }}
    </div>
    <input type="submit" value="提交" class="btn btn-lg btn-primary"/>
</form>
</div>
{% 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 %}
    <p class="text-center">密码已重置,点击返回<a href="{% url 'account:login'%}">登录页面</a></p>
    {% endblock %}
    

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

EMAIL_HOST = 'smtp.163.com'
EMAIL_HOST_USER = "username@163.com"
EMAIL_HOST_PASSWORD = "**********"
EMAIL_PORT = 25
EMAIL_USE_TLS = True
DEFAULT_FROM_EMAIL = "username@163.com"

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值