使用自定义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
相关产品推荐
相关产品推荐

