class BaseFormSet
[source]
A formset is a layer of abstraction to work with multiple forms on the same page. It can be best compared to a data grid. Let’s say you have the following form:
1 2 3 4 | >>> from django import forms >>> class ArticleForm(forms.Form): ... title = forms.CharField() ... pub_date = forms.DateField() |
You might want to allow the user to create several articles at once. To create a formset out of an ArticleForm
you would do:
1 2 | >>> from django.forms import formset_factory >>> ArticleFormSet = formset_factory(ArticleForm) |
You now have created a formset named ArticleFormSet
. The formset gives you the ability to iterate over the forms in the formset and display them as you would with a regular form:
1 2 3 4 5 | >>> formset = ArticleFormSet() >>> for form in formset: ... print (form.as_table()) <tr><th><label for = "id_form-0-title" >Title:< / label>< / th><td>< input type = "text" name = "form-0-title" id = "id_form-0-title" / >< / td>< / tr> <tr><th><label for = "id_form-0-pub_date" >Pub date:< / label>< / th><td>< input type = "text" name = "form-0-pub_date" id = "id_form-0-pub_date" / >< / td>< / tr> |
As you can see it only displayed one empty form. The number of empty forms that is displayed is controlled by the extra
parameter. By default, formset_factory()
defines one extra form; the following example will display two blank forms:
1 | >>> ArticleFormSet = formset_factory(ArticleForm, extra = 2 ) |
Iterating over the formset
will render the forms in the order they were created. You can change this order by providing an alternate implementation for the __iter__()
method.
Formsets can also be indexed into, which returns the corresponding form. If you override __iter__
, you will need to also override __getitem__
to have matching behavior.
Please login to continue.