You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 08:54:04