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

Django登录用户密码修改异常:提示修改成功但未实际生效

密码修改提示成功但实际未生效的问题修复

你的代码里有两个核心问题导致密码没真正更新,同时还有一处小的参数错误,以下是修复方案:

修正后的完整代码

def changepassword(request):
    if request.method == 'POST':
        # 验证旧密码:注意username参数要传用户名字符串,不是User对象
        user = authenticate(request, username=request.user.username, password=request.POST['old'])
        if user is None:
            return render(request, 'pmp/changepassword.html', {'error': '当前密码输入错误!'})
        else:
            new_pwd = request.POST['password']
            confirm_pwd = request.POST['confirm']
            if new_pwd == confirm_pwd:
                u = request.user
                # 使用用户输入的新密码,而非硬编码的字符串
                u.set_password(new_pwd)
                # 必须调用save()才能将修改写入数据库
                u.save()
                return render(request, 'pmp/changepassword.html', {'success':'密码已成功修改!'})
            else:
                return render(request, 'pmp/changepassword.html', {'error': '新密码与确认密码不匹配!'})
    return render(request, 'pmp/changepassword.html')

错误点说明

  1. 硬编码密码参数:原代码中u.set_password('password')是把密码固定成了字符串"password",完全没用到用户输入的新密码,这是最核心的问题。
  2. 未保存用户实例:Django模型对象的修改仅在内存中生效,必须调用save()方法才能将变更写入数据库,原代码漏掉了这一步,导致密码修改没有持久化。
  3. authenticate参数错误:authenticate的username参数需要传入字符串类型的用户名,原代码传了request.user(User对象),虽然部分场景下可能隐式转换,但规范写法应该是request.user.username。
  4. 冗余的try-except块:当前逻辑不会抛出ValueError,这个异常捕获完全没必要,反而可能掩盖其他潜在问题,直接移除即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 04:15:29