Django更新视图报MultiValueDictKeyError但新增功能正常求解
问题根因
你触发MultiValueDictKeyError的核心原因是前端表单input的name属性值,和后端视图从request.POST里取的key名不匹配,具体对应错误如下:
- 前端
duyurutipi对应的input name是dduyurutipi,后端取值写的是request.POST['duyurutipi'] - 前端
incidentno对应的input name是dincidentno,后端取值写的是request.POST['incidentno'] - 前端
baslangiczamani对应的input name是dbaslangiczamani,后端取值写的是request.POST['baslangiczamani'] - 前端
olusturulmatarihi对应的input name是dolusturulmatarihi,后端取值写的是request.POST['olusturulmatarihi'] - 前端
aciklama对应的input name是daciklama,后端取值写的是request.POST['aciklama']
解决方案
两种修复方案二选一即可:
方案1:修改后端视图取值逻辑(无需改动前端)
把views.py里的更新函数替换为以下代码:
def problemduyurusuupdate(request, id): problemmember = problemduyuru.objects.get(id=id) # 取值key替换为前端表单input对应的name值 problemmember.duyurutipi = request.POST['dduyurutipi'] problemmember.incidentno = request.POST['dincidentno'] problemmember.baslangiczamani = request.POST['dbaslangiczamani'] problemmember.aciklama = request.POST['daciklama'] problemmember.olusturulmatarihi = request.POST['dolusturulmatarihi'] problemmember.save() messages.success(request, 'Alarmlar was updated successfully!') return redirect('/problemduyurusu')
方案2:修改前端表单name属性(和你之前复用的代码逻辑统一)
把所有input标签的name属性前缀d去掉,和后端取值key保持一致即可,示例如下:
把
<input type="text" class="form-control" value="{{ problemmembers.duyurutipi }}" name="dduyurutipi" id="dduyurutipi">
修改为
<input type="text" class="form-control" value="{{ problemmembers.duyurutipi }}" name="duyurutipi" id="dduyurutipi">
剩余4个input同理,分别把name改为incidentno、baslangiczamani、olusturulmatarihi、aciklama。
优化建议
为了避免后续再出现同类错误,推荐两种优化方式:
- 取值时使用
request.POST.get('key', '默认值'),就算key不存在也不会直接抛错,只会返回预设的默认值,便于排查问题 - 优先使用Django自带的ModelForm处理表单提交,自动完成字段映射和参数校验,无需手动编写逐个取值的逻辑,大幅降低手写错误概率
内容的提问来源于stack exchange,提问作者thedoctor
相关产品推荐
相关产品推荐

