Django CRUD更新报错update_user()缺失必填位置参数eid解决指南
错误原因
你的update_user视图定义要求必须传入位置参数eid,但你是将eid放在POST请求的表单数据中提交,并没有作为URL路径参数传递,同时对应路由也没有配置eid参数的占位规则,因此触发参数缺失报错。
修复方案
步骤1:修改urls.py路由配置
删除update_user路由中eid的路径参数配置,修改后参考如下:
# 你的urls.py中对应配置改为 path('update_user/', views.update_user, name='update_user'),
步骤2:修改views.py中的update_user视图
替换原有update_user函数代码如下,兼容两种POST场景:提交邮箱加载编辑表单、提交编辑内容执行更新,同时使用你定义好的专属更新表单,避免修改不可变字段:
def update_user(request): if request.method == "POST": # 场景1:从update.html提交了待修改的用户邮箱,加载编辑表单 if 'eid' in request.POST: eid = request.POST.get('eid') # 查询不到对应用户直接返回404,避免报错 user_obj = get_object_or_404(angelaFormModel, email=eid) form = angelaFormModelUpdate_form(instance=user_obj) # 把邮箱传到模板作为隐藏字段,提交更新时用 return render(request, 'update_user.html', {'form': form, 'eid': eid}) # 场景2:提交了编辑后的表单,执行更新 else: eid = request.POST.get('eid') user_obj = get_object_or_404(angelaFormModel, email=eid) form = angelaFormModelUpdate_form(request.POST, instance=user_obj) if form.is_valid(): # 新增密码一致性校验,和创建逻辑对齐 password = form.cleaned_data.get('password') confirm_pwd = form.cleaned_data.get('confirm_password') if password != confirm_pwd: return render(request, 'update_user.html', { 'form': form, 'eid': eid, 'message': '两次输入的密码不一致,请重新输入' }) form.save() return redirect("home") return render(request, 'update_user.html', {'form': form, 'eid': eid})
步骤3:修改update_user.html模板
在表单中新增隐藏字段存储用户邮箱,同时增加错误提示展示位置:
<!DOCTYPE html> <html lang="en"> {% load crispy_forms_tags %} <head> <meta charset="UTF-8"> <title>update_user</title> </head> <body> <h1>update_user</h1> <!-- 错误提示 --> {% if message %} <p style="color: red;">{{ message }}</p> {% endif %} <form method="POST"> {% csrf_token %} <!-- 新增隐藏字段存邮箱 --> <input type="hidden" name="eid" value="{{ eid }}"> First Name: {{ form.First_name }}<br><br> Last Name: {{ form.last_name }}<br><br> Contact No: {{ form.phone }}<br><br> Password: {{ form.password }}<br><br> Confirm Password: {{ form.confirm_password }}<br><br> <button type="submit">Update</button> </form> </body> </html>
Django模型实例化与UPDATE逻辑说明
Django的模型实例分为两类,UPDATE操作的核心就是绑定已存在的数据库记录实例:
- 未持久化实例:直接通过模型类创建的实例,比如
obj = angelaFormModel(First_name="测试"),此时实例还没有写入数据库,调用save()方法会执行INSERT语句,新增一条记录。 - 已持久化实例:通过查询方法从数据库拿到的实例,比如
obj = angelaFormModel.objects.get(email=xxx),这个实例已经和数据库中的某条记录一一绑定,修改实例属性后调用save(),或者把实例作为instance参数传给ModelForm后调用form.save(),都会执行UPDATE语句,修改对应数据库记录,不会新增数据。
内容的提问来源于stack exchange,提问作者mayank gupta
相关产品推荐
相关产品推荐

