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

修改django-rest-passwordreset确认视图 密码重置后更新用户字段

django-rest-passwordreset 密码重置成功后更新自定义字段实现方案

不需要重写库自带的confirm视图,直接使用库官方预留的信号钩子实现即可,该方案耦合度最低,不会影响后续库版本升级,是最稳妥的实现方式。

实现步骤

  • 首先确认你的自定义用户模型已正确添加changed_password字段,参考定义如下:
# users/models.py
from django.contrib.auth.models import AbstractUser
from django.db import models

class CustomUser(AbstractUser):
    changed_password = models.BooleanField(default=False, verbose_name="密码修改状态")
  • 编写信号接收函数,绑定密码重置成功的触发事件:
    django-rest-passwordreset内置了password_reset_confirmed信号,会在重置token校验通过、新密码成功写入用户实例后触发,你只需要在信号回调里更新目标字段即可。在你的用户模块下新建signals.py写入以下代码:
# users/signals.py
from django.dispatch import receiver
from django_rest_passwordreset.signals import password_reset_confirmed

@receiver(password_reset_confirmed)
def mark_password_changed(sender, user, *args, **kwargs):
    user.changed_password = True
    # 指定update_fields只更新目标字段,避免触发全量save的额外逻辑
    user.save(update_fields=["changed_password"])
  • 注册信号,保证Django启动时能正常加载回调逻辑:
    很多人写了信号不生效都是因为没做注册,需要修改对应app的apps.py配置,添加ready方法导入信号模块:
# users/apps.py
from django.apps import AppConfig

class UsersConfig(AppConfig):
    default_auto_field = "django.db.models.BigAutoField"
    name = "users" # 替换为你自己的app名称

    def ready(self):
        import users.signals # 替换为你自己的signals模块路径

可选方案:重写confirm视图

如果你本身就有定制confirm接口逻辑的需求(比如修改返回值、增加额外校验),也可以直接继承库原有的ResetPasswordConfirm视图,在密码保存成功的逻辑分支里同步更新changed_password字段即可,但这种方式需要自己维护视图逻辑,后续库更新安全补丁时需要手动同步代码,优先级低于信号方案。

验证方式

走一遍完整密码重置流程:申请重置token -> 携带合法token提交新密码 -> 查询对应用户实例,changed_password字段会自动更新为True。


内容的提问来源于stack exchange,提问作者Diana

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 17:18:21