如何在Django中实现密码重置功能

2023-04-11 00:00:00 功能 密码 重置

在Django中实现密码重置功能,可以参考以下步骤:

  1. 配置邮件系统:Django需要通过邮件发送密码重置链接给用户,因此需要在settings.py中配置邮件系统,如下:
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_PORT = 587
EMAIL_USE_TLS = True
DEFAULT_FROM_EMAIL = 'your_email@example.com'
EMAIL_HOST_USER = 'your_email@example.com'
EMAIL_HOST_PASSWORD = 'your_email_password'
  1. 创建密码重置表单:在forms.py中创建一个PasswordResetForm表单,包含一个EmailField字段,用于接收用户输入的email地址。
from django import forms
from django.contrib.auth.forms import PasswordResetForm

class PasswordResetForm(PasswordResetForm):
    email = forms.EmailField(label='Email', max_length=254, 
        widget=forms.EmailInput(attrs={'autocomplete': 'email'}))
  1. 创建密码重置视图:在views.py中创建一个PasswordResetView视图,该视图继承自Django内置的PasswordResetView视图,覆盖了其form_class属性,并添加template_name属性指定模板文件。
from django.contrib.auth.views import PasswordResetView
from django.urls import reverse_lazy

class PasswordResetView(PasswordResetView):
    form_class = PasswordResetForm
    template_name = 'accounts/password_reset.html'
    success_url = reverse_lazy('password_reset_done')
  1. 创建密码重置确认视图:在views.py中创建一个PasswordResetConfirmView视图,该视图继承自Django内置的PasswordResetConfirmView视图,并添加template_name属性指定模板文件。
from django.contrib.auth.views import PasswordResetConfirmView

class PasswordResetConfirmView(PasswordResetConfirmView):
    template_name = 'accounts/password_reset_confirm.html'
    success_url = reverse_lazy('password_reset_complete')
  1. 创建模板文件:在templates目录下创建和视图中指定的模板名称相同的html文件,用于显示相应的表单和信息。

密码重置模板(password_reset.html):

{% extends 'base.html' %}
{% block content %}

  <h2>Reset Password</h2>
  <form method="post">
    {% csrf_token %}
    <div class="fieldWrapper">
      {{ form.email.label_tag }}
      {{ form.email }}
    </div>
    <button type="submit">Reset</button>
  </form>

{% endblock %}

密码重置确认模板(password_reset_confirm.html):

{% extends 'base.html' %}
{% block content %}

  <h2>Confirm Password Reset</h2>
  <p>Please enter a new password for your account:</p>
  <form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">Change Password</button>
  </form>

{% endblock %}
  1. 设置URL:在urls.py文件中设置对应的URL,如下:
from django.urls import path
from django.contrib.auth.views import PasswordResetDoneView, PasswordResetCompleteView
from .views import PasswordResetView, PasswordResetConfirmView

urlpatterns = [
    path('reset/', PasswordResetView.as_view(), name='password_reset'),
    path('reset/done/', PasswordResetDoneView.as_view(), name='password_reset_done'),
    path('reset/<uidb64>/<token>/', PasswordResetConfirmView.as_view(), name='password_reset_confirm'),
    path('reset/complete/', PasswordResetCompleteView.as_view(), name='password_reset_complete'),
]

现在,当用户在网站登录页面点击“忘记密码”按钮时,将会跳转至密码重置表单页面,用户输入邮箱地址点击“发送邮件”按钮后,Django将会生成密码重置链接并发送至用户邮箱,用户通过该链接进入密码重置确认页面,输入新密码并提交后,用户的密码将会被重设。

相关文章