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

如何用Django更新用户密码并存库 员工账号更新数据未入库排查

错误分析及修复方案

核心错误说明

你一共存在3类关键错误导致数据无法更新到数据库,以下是具体问题和修复代码:

1. views.py 视图逻辑错误(最核心原因)

  • 没有提取POST请求提交的表单数据,直接对查询到的原始用户对象执行save(),相当于没有修改任何字段就保存,自然不会更新数据库
  • GET请求渲染的模板错误:更新操作对应的模板是updatestaff.html,但现有代码返回的是员工列表页allstaff.html,根本无法正常加载更新表单
  • 密码存储不符合Django规范:不能直接明文赋值密码,需要调用set_password()方法加密后存储,否则后续登录校验也会失败

修复后的update视图代码

def update(request, id):
    user = get_object_or_404(User, id=id)
    if request.method == "POST":
        # 提取前端提交的表单数据
        new_username = request.POST.get('username')
        new_email = request.POST.get('Email')
        new_password = request.POST.get('password')
        con_password = request.POST.get('con-pass')
        
        # 基础校验:两次密码一致才执行更新
        if new_password and new_password == con_password:
            user.username = new_username
            user.email = new_email
            user.set_password(new_password) # 自动加密密码
            user.save()
            return redirect("/allstaff")
        # 可自行扩展错误提示逻辑,比如密码不一致时返回提示给前端
    context = {"user": user}
    # 渲染更新表单模板,同时传递原有用户信息用于回显
    return render(request, 'updatestaff.html', context)

2. updatestaff.html 前端模板错误

  • 密码输入框类型错误:当前用type="text"会明文显示密码,需要改成type="password"
  • 邮箱输入框类型错误:当前用type="text"无法触发前端邮箱格式校验,建议改成type="email"
  • 没有回显原有数据:进入更新页时输入框默认是空的,建议填充原有用户信息,避免不需要修改的字段还要重复输入
  • 提交按钮未指定类型:部分浏览器可能识别异常,建议添加type="submit"属性

修复后的表单核心代码

<label for="Username">Username:</label><br>
<input type="text" id="username" name="username" value="{{ user.username }}"><br>
<label for="Email">Email:</label><br>
<input type="email" id="Email" name="Email" value="{{ user.email }}"><br>
<label for="password">Password:</label><br>
<input type="password" id="password" name="password"><br>
<label for="con-pass">Confirm Password:</label><br>
<input type="password" id="con-pass" name="con-pass"><br><br>
<button class="button" type="submit">Submit</button>

3. urls.py 配置冗余问题

你重复定义了register路径,前面的path('register/', views.register, name='register')和后面的path('register/', views.register_view, name='register')冲突,会以后面定义的为准,建议删除无用的冗余配置。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 17:36:03