[Solved]-Django formset – show extra fields only when no initial data set?


I’ve come up with a solution that works with Django 1.1. I created a subclass of BaseFormSet that overrides the total_form_count method such that, if initial forms exist, the total does not include extra forms. Bit of a hack perhaps, and maybe there’s a better solution that I couldn’t find, but it works.

class SensibleFormset(BaseFormSet):
    def total_form_count(self):
        """Returns the total number of forms in this FormSet."""
        if self.data or self.files:
            return self.management_form.cleaned_data[TOTAL_FORM_COUNT]
            if self.initial_form_count() > 0:
                total_forms = self.initial_form_count()
                total_forms = self.initial_form_count() + self.extra
            if total_forms > self.max_num > 0:
                total_forms = self.max_num
            return total_forms


Use the max_num keyword argument to formset_factory:

MyFormset = formset_factory([...], extra=1, max_num=1)

For more details, check out limiting the maximum number of forms.

One hitch: presumably you want to be able to process more than one blank form. This isn’t too hard; just make sure that you don’t use the max_num keyword argument in the POST processing side.

Leave a comment