Django提交多图上传表单报post_id非空约束违规错误如何解决
问题根因
你的报错核心是PostImages实例保存时未正确赋值post外键,具体有2个代码逻辑问题:
test.save(commit=False)会返回未持久化到数据库的PostImages实例,你没有接收该返回值,直接给表单对象test绑定post属性是无效的——表单本身没有post字段,最终写入数据库的实例post仍为空。- 你开启了多文件上传,同一个表单实例循环调用
save()只会操作同一个实例,无法对应多个上传的图片文件。
修复后的视图代码
def DetailPostView(request, pk): model = Post post = Post.objects.get(pk=pk) if request.method == 'POST': test = PostImagesForm(request.POST, request.FILES) files = request.FILES.getlist('images') if test.is_valid(): for f in files: # 接收表单返回的未保存实例 img_instance = test.save(commit=False) # 直接复用已经查询到的post对象,无需重复查询数据库 img_instance.post = post # 给实例赋值当前循环到的图片文件 img_instance.images = f # 保存实例到数据库 img_instance.save() else: # 注意这里要打印当前表单实例的错误,不是打印表单类的errors print(test.errors) context = { 'post':post, 'PostImagesForm':PostImagesForm, } return render(request, 'blog/post_detail.html', context)
补充说明
你之前硬编码主键仍报错的原因也和逻辑问题有关:你把主键赋值给了表单对象而非模型实例,模型实例的post字段始终没有拿到值,所以触发非空约束。修复后不需要修改模型、表单或者数据库配置,仅调整视图逻辑即可正常运行。
内容的提问来源于stack exchange,提问作者Wazy
相关产品推荐
相关产品推荐

