简体   繁体   English

Django 内联表单集不保存默认值

[英]Django inline formset not saving default values

I have a child inlineformset that saves if it has been changed by the user, but does not save the default value if left unchanged.我有一个子 inlineformset,如果用户更改了它,它会保存,但如果保持不变,则不会保存默认值。

SeVsEff is the child, and patient is the parent SeVsEff是孩子,而患者是父母

models.py模型.py

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)

    user = models.ForeignKey(
        settings.AUTH_USER_MODEL, null=True, on_delete=models.SET_NULL
    )

class SeVsEff(TimeStampedModel):
    value = models.IntegerField(default=20)
    patient = models.ForeignKey(Patient, on_delete=models.CASCADE)

forms.py表格.py

class PatientForm(ModelForm):
    class Meta:
        model = Patient
        fields = ["name"]

SevseffFormSet = inlineformset_factory(
    Patient,
    SeVsEff,
    fields=("value",),
    widgets={'value': RangeInput()},
    extra=0,
    min_num=1,
    validate_min=True,
    labels=None,
)

views.py视图.py

    def post(self, *args, **kwargs):
        form = PatientForm(data=self.request.POST)
        sevseff_formset = SevseffFormSet(data=self.request.POST)

        if form.is_valid():
            patient_instance = form.save()
            patient_instance.user = self.request.user
            patient_instance.save()

            if sevseff_formset.is_valid():
                sevseff_name = sevseff_formset.save(commit=False)
                for sevseff in sevseff_name:
                    sevseff.patient = patient_instance
                    sevseff.save()

So I think the issues is that the sevseff_formset is not registered as valid unless it is changed, but if I add something like:所以我认为问题在于 sevseff_formset 没有被注册为有效,除非它被改变,但如果我添加如下内容:

            if not sevseff_formset.has_changed():
                sevseff_name = sevseff_formset.save(commit=False)
                for sevseff in sevseff_name:
                    sevseff.patient = patient_instance
                    sevseff.save()

This doesn't work as sevseff_name is empty.这不起作用,因为 sevseff_name 为空。

This does it:这样做:

sevseff_name = sevseff_formset.save(commit=False)
for sevseff in sevseff_name:
    sevseff.patient = patient_instance
    sevseff.save()
if not sevseff_name:
    SeVsEff(value=20, patient=patient_instance).save()

Solution from https://forum.djangoproject.com/t/django-inline-formset-not-saving-default-values/10647/3来自https://forum.djangoproject.com/t/django-inline-formset-not- Saving-default-values/10647/3 的解决方案

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM