Django提交表单时ManyToManyField(catagory)保存报错如何解决
错误原因
你遇到的报错本质是调用save_m2m()的时机错误,同时表单保存逻辑存在错误。Django的多对多关系依赖主模型(此处为Post)的主键ID:只有Post实例先被写入数据库、生成有效ID后,才能操作关联的多对多中间表。你之前在Post还未保存到数据库时就调用save_m2m(),自然会触发"需要字段id的值"的报错。另外你原代码中直接将表单对象赋值给new_post,后续赋值user的操作实际是作用在表单对象上,而非Post模型实例,也会导致字段赋值失败。
修正后的views.py代码
@login_required def make_post(req): context = {} form = PostForm(req.POST or None) if req.method == "POST": if form.is_valid(): author = Author.objects.get(user=req.user) # 接收commit=False返回的未保存Post实例 new_post = form.save(commit=False) # 给Post实例赋值user字段 new_post.user = author # 先保存Post实例到数据库,生成主键ID new_post.save() # 此时再调用save_m2m保存多对多字段(catagory、tags) form.save_m2m() return redirect('blog:blog-index') context.update({ 'form': form, 'title': 'Create A Post' }) return render(req, 'create.html', context)
核心修改点
- 接收
form.save(commit=False)的返回值,得到未写入数据库的Post实例 - 先给Post实例赋值必填的
user字段,再调用实例的save()方法写入数据库,获取有效ID - 所有主模型字段保存完成后,再调用
form.save_m2m()处理多对多字段的关联
内容的提问来源于stack exchange,提问作者Pratik Choudhuri
相关产品推荐
相关产品推荐

