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

使用自定义User模型时Django无法修改密码的问题求助

问题排查与修复方案

1. 先修复URL配置的语法错误

你的urlpatterns里第一个path末尾少了逗号,这会直接导致Python语法错误,自定义的CustomPasswordChangeView根本不会生效,系统还是在用默认的密码修改视图。改完后代码是:

urlpatterns = [
    path('password_change/', CustomPasswordChangeView.as_view(), name='password_change'),
    path('', include('django.contrib.auth.urls')),   
]

2. 修正CustomUser的set_password方法

你重写的set_password只改了密码字段,但没把修改保存到数据库,这就是密码改完没生效的核心原因。有两种处理方式:

方案A:直接移除自定义方法(推荐)

AbstractUser本身已经实现了完整的密码设置逻辑,完全没必要自己重写,删掉下面这段代码就行:

# 删掉这个方法
def set_password(self, raw_password):
    self.password = make_password(raw_password)
    self._password = raw_password

方案B:补充保存逻辑(仅当有特殊需求时用)

如果必须保留自定义方法,要加上保存步骤:

def set_password(self, raw_password):
    self.password = make_password(raw_password)
    self._password = raw_password
    self.save(update_fields=['password'])  # 新增这行,把修改同步到数据库

3. 调整密码修改视图的逻辑

你原来的form_valid方法顺序可以优化下,确保密码保存后再更新session哈希,避免登出问题:

class CustomPasswordChangeView(auth.views.PasswordChangeView):
    template_name = "registration/password_change_form.html"
    success_url = reverse_lazy("password_change_done")

    def form_valid(self, form):
        # 先保存用户密码修改
        user = form.save()
        # 更新session哈希,防止登出
        update_session_auth_hash(self.request, user)
        return super().form_valid(form)

4. 验证邮件重置密码功能

搞定上面的问题后,邮件重置密码应该就能正常工作了——Django默认的重置视图会正确调用修复后的set_password方法完成密码更新。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 17:08:19