Open In App

Django ModelFormSets

Last Updated : 24 May, 2025
Comments
Improve
Suggest changes
Like Article
Like
Report

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:

Python
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.

Python
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:

Python
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:

html
<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/

django-modelformsets
Model Form

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

django-model-formset-result
Django Formset

Next Article
Practice Tags :

Similar Reads