Django提交含外键关联的两个表单报错求助
解决Django中双表单提交的外键完整性问题
你遇到的问题核心是直接给表单实例设置外键字段,而不是给表单对应的模型实例赋值,这就导致MN模型的外键字段没有被正确填充,触发了数据库的非空约束错误。咱们先捋清楚问题出在哪,再给出修正方案。
问题分析
你在代码里的操作逻辑有个关键误区:
- 成功保存了
CustomerSystem实例model_instance - 然后直接给
form_mn.customer_system_serial_number = model_instance,接着调用form_mn.save()
但form_mn是表单实例,不是MN的模型实例,直接给表单设置外键字段是无效的——表单本身不会把这个值传递给底层的模型对象,所以当你调用form_mn.save()时,MN模型的外键字段依然是空的,自然触发完整性错误。
另外,你的视图还有个小问题:当请求是GET的时候,你错误地用request.POST初始化表单,这会导致空表单加载异常,应该改成初始化空表单。
修正后的视图代码
@login_required def add_customers(request): if request.method == 'POST': form_cs = CustomerSystemForm(request.POST, prefix='cs') form_mn = MNForm(request.POST, prefix='mn') if form_cs.is_valid() and form_mn.is_valid(): # 保存CustomerSystem实例到数据库 cs_instance = form_cs.save() # 获取MN的模型实例但不立即保存到数据库 mn_instance = form_mn.save(commit=False) # 给MN模型实例设置外键关联 mn_instance.customer_system_serial_number = cs_instance # 保存MN实例到数据库 mn_instance.save() return HttpResponseRedirect('/database/customers') else: # GET请求时初始化空表单 form_cs = CustomerSystemForm(prefix='cs') form_mn = MNForm(prefix='mn') return render(request, 'database/customer_system.html', {'form_cs': form_cs, 'form_mn': form_mn})
关键修正点
- 对
MNForm使用save(commit=False),得到未保存到数据库的MN模型实例mn_instance - 给模型实例
mn_instance的外键字段赋值,而不是给表单实例赋值 - 修正GET请求的表单初始化逻辑,避免用空的POST数据初始化表单
这样修改后,两个模型实例就会正确关联,外键字段也会被正确填充,不会再触发完整性错误啦。
内容的提问来源于stack exchange,提问作者Bayko
相关产品推荐
相关产品推荐

