修改密码
一般密码修改流程为用户点击修改密码后跳转到密码修改页面,在修改页面中输入旧密码和新密码,若用户旧密码通过验证,则用新密码替换旧密码并保存至数据库。
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等)服务,不同邮箱需要不同设置。
本文介绍了Django中如何实现用户密码的修改和重置功能。密码修改利用Django内置的类视图,通过设置urls.py、模板文件及验证流程来完成。密码重置涉及用户邮箱验证,包括填写邮箱、发送验证链接、设置新密码等步骤,同样使用Django提供的视图类,并配置相关模板和邮件设置。

7534

被折叠的 条评论
为什么被折叠?



