You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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>

逻辑说明

  1. 使用@login_required确保只有已登录用户能访问该视图
  2. POST请求时,直接用当前用户的邮箱填充PasswordResetForm,跳过前端输入环节
  3. 调用form.save()触发Django内置的密码重置邮件发送逻辑,同时指定你自定义的邮件模板
  4. 邮件发送完成后直接跳转至密码重置完成页面

内容的提问来源于stack exchange,提问作者Paulo Roberto Filho

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 18:12:19