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

