首页 > 解决方案 > 如果为空,则阻止 django formset 提交

问题描述

我有一个表单,我只希望用户能够在填写表单集中的字段时提交。这是一个动态表单集,用户可以在其中添加和删除行,我想要它,以便至少一行需要有一个条目。但是,即使表单集无效,似乎也可以提交。

例如,如果用户没有输入“年龄”条目,则弹出窗口将要求他们输入一些内容。“诊断”不会发生这种情况

模型.py

class Patient(TimeStampedModel):
    patient_id = models.UUIDField(primary_key=True, unique=True, default=uuid.uuid4, editable=False)
    
    age = models.IntegerField("Age")

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

    
class Diagnosis(TimeStampedModel):
    
    DIAG_CHOICES = [
        (‘heart’, (
                (‘mi’, ‘heart attack’),
                (‘chf’, ‘heart failure’),
            )
        ),
        (‘kidney’, (
                (‘arf’, ‘acute renal failure’),
                (‘crf’, ‘chronic renal failure’),
            )
        ),
        ]
    
    diag_name = models.CharField(
        "diag", max_length=200,
        choices=DIAG_CHOICES, blank=False)

    patient = models.ForeignKey(Patient, on_delete=models.CASCADE)

表格.py

class PatientForm(ModelForm):

    class Meta:
        model = Patient
        fields = ['age']


DiagnosisFormSet = inlineformset_factory(
    Patient, Diagnosis, fields=("diag_name", ), extra=0, min_num=1, validate_min=True)

视图.py


class PatientAddView(LoginRequiredMixin,TemplateView):
    model = Patient
    template_name = "../templates/patient/add.html"

    def get(self, *args, **kwargs):
        patient_form = PatientForm
        diagnosis_formset = DiagnosisFormSet(queryset=Diagnosis.objects.none())

        return self.render_to_response({'diagnosis_formset': diagnosis_formset,
                                        'patient_form': patient_form
                                })

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

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

            if diagnosis_formset.is_valid():
                diag_name = diagnosis_formset.save(commit=False)
                for diag in diag_name:
                    diag.patient = patient_instance
                    diag.save()
          

        return redirect(reverse(
                        'patient:treatment_detail',
                        kwargs={"patient_id": patient_instance.patient_id}))

标签: pythondjangodjango-forms

解决方案


from django.forms.widgets import Select    

DiagnosisFormSet = inlineformset_factory(
        Patient, Diagnosis, fields=("diag_name",), extra=1, min_num=1, validate_min=True,
        widgets={
            'diag_name': Select(attrs={'required': 'required'}),
        },
    )

推荐阅读