Django通过外键关联多图片模型上传时报错如何解决
问题原因
你在Images模型中定义的ad字段是关联Ad模型的外键字段,Django ORM处理外键字段时有固定的赋值规则:
- 直接给外键字段名(此处为
ad)赋值时,必须传入对应关联模型的实例对象,你原本的写法ad=valid_form(valid_form是调用form.save()返回的Ad实例)符合要求,所以运行正常。 - 你修改后给
ad参数传入的是valid_form.pk(即Ad实例的主键整数值),类型不匹配,因此触发报错。
解决方案
有两种可选写法:
- 保持原写法即可,直接传入
Ad实例给ad参数,这是Django推荐的常规写法:
photo = Images(ad=valid_form, image=image)
- 如果你确实需要通过主键值赋值,需要用Django自动为外键生成的
_id后缀字段,将参数改为ad_id即可:
photo = Images(ad_id=valid_form.pk, image=image)
额外优化建议
你贴出的视图代码存在几个可优化的问题,避免后续出现其他异常:
- 缩进错误:
def add_new(request):下的所有代码都需要缩进一级,否则运行会直接报错。 - 表单实例化缺少文件参数:上传文件的场景下,实例化表单必须传入
request.FILES,否则无法获取到上传的图片资源。 - 跳转逻辑位置错误:
return HttpResponseRedirect('/')应该放到if form.is_valid():的代码块内部,否则即使表单验证失败也会直接跳转到首页,用户看不到错误提示。
优化后参考代码:
def add_new(request): if request.method=='POST': form=AddForm(request.POST, request.FILES) if form.is_valid(): valid_form=form.save() for image in request.FILES.getlist('images'): photo=Images(ad=valid_form,image=image) photo.save() return HttpResponseRedirect('/') else: form=AddForm() return render(request,'add_post.html',{'form':form})
内容的提问来源于stack exchange,提问作者Темирлан Абдуллаев
相关产品推荐
相关产品推荐

