Django ModelFormSets
Django ModelFormsets provide a powerful way to manage multiple model-based forms on a single page. They allow you to create, update, or delete multiple instances of a model at once, using a group of forms that correspond to the model's fields.
Think of ModelFormsets as a collection of forms linked to a Django mode, similar to a data grid where each form corresponds to a single model instance.
Example Model: GeeksModel
Let's start with a simple model named GeeksModel defined in models.py:
from django.db import models
class GeeksModel(models.Model):
title = models.CharField(max_length=200)
description = models.TextField()
def __str__(self):
return self.title
- title and description are the fields representing model data.
- __str__ method helps display the model instances by their title.
Creating a ModelFormset
To create a formset for this model, use Django’s modelformset_factory function.
from django.forms import modelformset_factory
from .models import GeeksModel
GeeksFormSet = modelformset_factory(GeeksModel, fields=['title', 'description'])
- This creates a formset class that generates forms based on the GeeksModel.
Using ModelFormsets in Views
In views.py, you can create a view to render and process the formset:
from django.shortcuts import render
from django.forms import modelformset_factory
from .models import GeeksModel
def modelformset_view(request):
GeeksFormSet = modelformset_factory(GeeksModel, fields=['title', 'description'], extra=3)
if request.method == 'POST':
formset = GeeksFormSet(request.POST)
if formset.is_valid():
formset.save() # Saves all valid forms to the database
else:
formset = GeeksFormSet()
return render(request, 'home.html', {'formset': formset})
- extra=3 argument means three empty forms will be displayed for adding new entries.
- On POST, the formset is validated and saved automatically if valid.
Rendering ModelFormsets in Templates
In your template (home.html), render the formset like this:
<form method="POST" enctype="multipart/form-data">
{% csrf_token %}
{{ formset.as_p }}
<input type="submit" value="Submit">
</form>
- The management_form is required to keep track of formset data and validate the forms correctly.
- formset.as_p renders each form’s fields wrapped in <p> tags.
We can check if the form is working or not by running development server using command:
python manage.py runserver
And then visit: http://localhost:8000/

Hit submit and data will be saved in GeeksModel where server is running. One can use this data in any manner conveniently now.
