Django inline formset не сохраняет значения по умолчанию
У меня есть дочерний inlineformset, который сохраняет значение, если оно было изменено пользователем, но не сохраняет значение по умолчанию, если оно осталось неизменным.
SeVsEff является ребенком, а patient является родителем
models.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
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
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()
Так что я думаю, что проблема в том, что 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()
Это не работает, так как имя sevseff_name пустое.
Это делает это:
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()
Решение от https://forum.djangoproject.com/t/django-inline-formset-not-saving-default-values/10647/3