如何用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
相关产品推荐
相关产品推荐

