I have a form that I only want users to be able to submit if a field in a formset is filled. This is a dynamic formset in which users can add and remove rows, I want it so that at least one row needs to have an entry in it. However it seems that the formset is able to be submitted even if not valid.
For example if the user does not put an entry for 'age' a popup will request that they enter something. This does not occur for 'diagnosis'
models.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)
forms.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)
views.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}))
from Prevent django formset submission if empty
No comments:
Post a Comment