Django Formsets

Formsets in a Django is an advanced way of handling multiple forms on a single webpage. In other words, Formsets are a group of forms in Django. One might want to initialize multiple forms on a single page all of which may involve multiple POST requests, for example

from django import forms
class GeeksForm(forms.Form):
    title = forms.CharField()
    pub_date = forms.DateField()

Now one might want to permit the user to create articles at once, so if thought in a conventional manner one uses multiple forms and different names for each form to handle data on a single page but this would complicate the code as well as functionality. 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.
Now to create a formset of this GeeksForm,

from django.forms import formset_factory
GeeksFormSet = formset_factory(GeeksForm)

Creating and using Django Formsets

Illustration of Rendering Django Forms Manually using an Example. Consider a project named geeksforgeeks having an app named geeks.

Refer to the following articles to check how to create a project and an app in Django.

In your geeks app make a new file called forms.py where you would be making all your forms. To create a Django form you need to use Django Form Class. Let’s demonstrate how,
In your forms.py Enter the following,



filter_none

edit
close

play_arrow

link
brightness_4
code

from django import forms
  
# create a form
class GeeksForm(forms.Form):
    title = forms.CharField()
    description = forms.CharField()

chevron_right


Let’s explain what exactly is happening, left side denotes the name of the field and to right of it, you define various functionalities of an input field correspondingly. A field’s syntax is denoted as
Syntax :

Field_name = forms.FieldType(attributes)

Now to create a simple formset of this form, move to views.py and create a formset_view as below.

filter_none

edit
close

play_arrow

link
brightness_4
code

from django.shortcuts import render
  
# relative import of forms
from .forms import GeeksForm
  
# importing formset_factory
from django.forms import formset_factory
  
def formset_view(request):
    context ={}
  
    # creating a formset
    GeeksFormSet = formset_factory(GeeksForm)
    formset = GeeksFormSet()
      
    # Add the formset to context dictionary
    context['formset']= formset
    return render(request, "home.html", context)

chevron_right


To render the formset through HTML, create a html file “home.html”. Now let’s edit templates > home.html

filter_none

edit
close

play_arrow

link
brightness_4
code

<form method="POST" enctype="multipart/form-data">
    {% csrf_token %}
    {{ formset.as_p }}
    <input type="submit" value="Submit">
</form>

chevron_right


All set to check if our formset is working or not let’s visit http://localhost:8000/.
django-formsets.
Our formset is working completely. Let’s learn how to modify this formset to use extra features of this formset.

How to create Multiple forms using Django Formsets

Django formsets are used to handle multiple instances of a form. One can create multiple forms easily using extra attribute of Django Formsets. In geeks/views.py,

filter_none

edit
close

play_arrow

link
brightness_4
code

from django.shortcuts import render
  
# relative import of forms
from .forms import GeeksForm
  
# importing formset_factory
from django.forms import formset_factory
  
def formset_view(request):
    context ={}
  
    # creating a formset and 5 instances of GeeksForm
    GeeksFormSet = formset_factory(GeeksForm, extra = 5)
    formset = GeeksFormSet()
      
    # Add the formset to context dictionary
    context['formset']= formset
    return render(request, "home.html", context)

chevron_right


The keyword argument extra makes multiple copies of same form. If one wants to create 5 forms enter extra = 5 and similarly for others. Visit http://localhost:8000/ to check if 5 forms are created.
django-formsets-multiple-forms

Handling Multiple forms using Django Formsets

Creating a form is much easier than handling the data entered into those fields at the back end. Let’s try to demonstrate how one can easily use the data of a formset in a view. When trying to handle formset, Django formsets required one extra argument {{ formset.management_data }}. To know more about Management data, visit Understanding the ManagementForm.
In templates/home.html,

filter_none

edit
close

play_arrow

link
brightness_4
code

<form method="POST" enctype="multipart/form-data">
      
    <!-- Management data of formset -->
    {{ formset.management_data }}
  
    <!-- Security token -->
    {% csrf_token %}
  
    <!-- Using the formset -->
    {{ formset.as_p }}
      
    <input type="submit" value="Submit">
</form>

chevron_right


Now to check how and what type of data is being rendered edit formset_view to print the data. In geeks/view.py,

filter_none

edit
close

play_arrow

link
brightness_4
code

from django.shortcuts import render
  
# relative import of forms
from .forms import GeeksForm
  
# importing formset_factory
from django.forms import formset_factory
  
def formset_view(request):
    context ={}
  
    # creating a formset and 5 instances of GeeksForm
    GeeksFormSet = formset_factory(GeeksForm, extra = 3)
    formset = GeeksFormSet(request.POST or None)
      
    # print formset data if it is valid
    if formset.is_valid():
        for form in formset:
            print(form.cleaned_data)
              
    # Add the formset to context dictionary
    context['formset']= formset
    return render(request, "home.html", context)

chevron_right


Now let’s try to enter data in the formset through http://localhost:8000/
enter-formset-data-django-formsets
Hit submit and data will be display in command line where server is running. One can use this data in any manner conveniently now.
django-formsets-use-data1
Formset is advanced stuff which can be used to resolve a number of problems but should be used with correct syntax and field validations otherwise conflicts and errors will disrupt the normal functioning. To know more about Formsets, Visit Official Documentation for Formsets.




My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.


Article Tags :

1


Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.