Django保存Patient父表单与Med子表单时未保存关联对象错误如何修复
报错根因
你收到的报错是因为Django的内联表单集必须绑定到已保存到数据库的父模型实例才能保存子模型数据。你之前的代码仅保存了Patient表单,但未将生成的Patient实例绑定到MedFormSet,导致Med实例的外键字段无法关联到对应患者,触发了Django的防数据丢失校验。
同时你的代码还存在3个隐性问题:
- Patient模型未定义表单中用到的
sex字段,会导致表单验证失败 - GET请求中直接传递了PatientForm类而非实例,会导致模板渲染异常
- 表单验证失败时直接跳转,不会返回错误提示给用户
代码修改
1. models.py 补全缺失字段
import uuid from django.db import models from django.utils.translation import gettext_lazy as _ class TimeStampedModel(models.Model): created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) class Meta: abstract = True class Patient(TimeStampedModel): patient_id = models.UUIDField(primary_key=True, unique=True, default=uuid.uuid4, editable=False) name = models.CharField(_("Patient Name"), max_length=255) # 补全表单中用到的性别字段,可根据业务调整可选值和是否必填 sex = models.CharField(_("性别"), max_length=10, choices=(('male','男'),('female','女')), blank=True) class Med(TimeStampedModel): med_name = models.CharField(_("MedName"), max_length=20) patient = models.ForeignKey(Patient, on_delete=models.CASCADE)
2. views.py 核心逻辑调整
from .forms import MedFormSet, PatientForm from django.urls import reverse_lazy from django.shortcuts import redirect class MedAddView(TemplateView): model = Patient template_name = "patient/med_add.html" success_url = reverse_lazy('patient:med_list') def get(self, *args, **kwargs): # 实例化PatientForm类,而非直接传递类本身 patient_form = PatientForm() formset = MedFormSet(queryset=Med.objects.none()) return self.render_to_response({'med_formset': formset, 'patient_form': patient_form}) def post(self, *args, **kwargs): patient_form = PatientForm(data=self.request.POST) if patient_form.is_valid(): # 先保存父模型拿到已持久化的实例 patient = patient_form.save() # 将父实例绑定到表单集,建立关联关系 formset = MedFormSet(data=self.request.POST, instance=patient) if formset.is_valid(): formset.save() return redirect(self.success_url) # 验证失败时返回带错误信息的表单 formset = MedFormSet(data=self.request.POST) return self.render_to_response({'med_formset': formset, 'patient_form': patient_form})
其他说明
原有forms.py、前端模板和动态添加表单的JS逻辑无需调整,修改后即可实现患者数据和关联用药记录的同步保存。
内容的提问来源于stack exchange,提问作者RobMcC
相关产品推荐
相关产品推荐

