要点:修改密码,使用邮箱重置密码
上期文章:用户登录与注册
视频:这个看看就行
一般密码修改流程为用户点击修改密码后跳转到密码修改页面,在修改页面中输入旧密码和新密码,若用户旧密码通过验证,则用新密码替换旧密码并保存至数据库。
Django内置了密码修改的方法,我们可以用其内置的方法完成此修改密码的操做。
Django提供的修改密码的方法是基于类的视图,我们不必再views.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 %}
{% endblock %}
一般只有在用户已登录的状态下才能修改密码,所以在用户进行修改密码操作之前需要先判断用户是否已登陆。
在 password_change_form.html中,修改表单提交地址:
{% if next %}
{% 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"),
]
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 %}
找回密码
{% 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")
]
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 %}
{% 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等)服务,不同邮箱需要不同设置。