Django保存带外键的对象时触发Make模型DoesNotExist错误如何解决
问题原因
你的表单代码里下拉选项的value值末尾多了一个多余空格:
<option value="{{ item.name_text }} ">{{ item }}</option>
{{ item.name_text }}后面的空格会被一起提交到后台,导致你拿到的name_text1比数据库中存储的name_text多了末尾空格,自然objects.get()查询不到匹配的Make对象,抛出DoesNotExist错误。
修复方案
- 首先修改HTML代码,去掉option标签value属性里的多余空格:
<option value="{{ item.name_text }}">{{ item }}</option>
如果怕后续还有类似空格问题,可以在查询时对提交的内容去除首尾空白:
name_text1 = request.POST.get('make').strip() make = Make.objects.get(name_text = name_text1)
其他注意事项
- 你之前测试
Make.objects.filter(name_text = "some value")看似能运行,是因为filter返回的是查询集,不能直接赋值给外键字段,否则会报错,必须取查询集中的单个对象:
make = Make.objects.filter(name_text = name_text1).first()
- 更稳妥的方案是下拉选项的value直接传Make的主键id,避免出现同名Make匹配错误的问题:
修改HTML部分:
<option value="{{ item.id }}">{{ item }}</option>
对应修改视图查询逻辑:
make_id = request.POST.get('make') make = Make.objects.get(id=make_id)
- 建议配合
get_object_or_404方法查询,避免非法提交导致程序直接抛出500错误:
from django.shortcuts import get_object_or_404 make = get_object_or_404(Make, id=make_id)
- 后续开发尽量使用Django自带的Form或ModelForm处理表单提交,自动完成数据校验,减少手动写表单出现的低级错误。
内容的提问来源于stack exchange,提问作者Harsha Kapila
相关产品推荐
相关产品推荐

