基于Django PasswordResetView实现已登录用户自定义密码修改功能
解决Django已登录用户直接触发密码重置邮件的需求
针对已登录用户修改密码时,无需输入旧密码或邮箱,直接发送密码重置邮件并跳转至完成页面的需求,你可以绕过PasswordResetView的表单输入环节,直接利用Django内置的PasswordResetForm处理邮件发送逻辑,具体实现如下:
自定义视图实现
from django.contrib.auth.decorators import login_required from django.contrib.auth.forms import PasswordResetForm from django.shortcuts import redirect, render @login_required def custom_password_change(request): if request.method == "POST": # 直接使用当前登录用户的邮箱构建密码重置表单 reset_form = PasswordResetForm({"email": request.user.email}) if reset_form.is_valid(): # 发送密码重置邮件,指定自定义邮件模板 reset_form.save( request=request, email_template_name='registration/password_change_email.html' ) # 跳转至密码重置完成页面 return redirect('password_change_done') # GET请求渲染简化版表单页面(仅需提交按钮,无需输入邮箱) return render(request, "registration/password_change_form.html")
配置URL路由
在项目的urls.py中添加对应的路由映射,将完成页面指向Django内置的PasswordResetDoneView:
from django.urls import path from django.contrib.auth.views import PasswordResetDoneView from .views import custom_password_change urlpatterns = [ path('password_change/', custom_password_change, name='custom_password_change'), path( 'password_change/done/', PasswordResetDoneView.as_view(template_name='registration/password_reset_done.html'), name='password_change_done' ), ]
页面模板调整
你的registration/password_change_form.html可以简化为仅包含提交按钮的表单,无需邮箱输入框:
<form method="post"> {% csrf_token %} <button type="submit">发送密码重置邮件</button> </form>
逻辑说明
- 使用
@login_required确保只有已登录用户能访问该视图 - POST请求时,直接用当前用户的邮箱填充
PasswordResetForm,跳过前端输入环节 - 调用
form.save()触发Django内置的密码重置邮件发送逻辑,同时指定你自定义的邮件模板 - 邮件发送完成后直接跳转至密码重置完成页面
内容的提问来源于stack exchange,提问作者Paulo Roberto Filho
相关产品推荐
相关产品推荐

