Subjects

All subjects Django Java Python React Spring Boot JavaScript PHP
Sign Up Free
Question 6 of 9 · Django Forms & Validation
Interview question

What are Django formsets and when do you use them? Django formsets क्या हैं और इन्हें कब use करते हैं?

Answer

Formsets manage multiple instances of the same form on one page - useful when a user needs to submit several related items at once (e.g. multiple order line items).

from django import forms
from django.forms import formset_factory, modelformset_factory

class BookForm(forms.Form):
    title = forms.CharField(max_length=200)
    price = forms.DecimalField()

# Creating a formset class from a regular Form
BookFormSet = formset_factory(BookForm, extra=3)  # 3 empty forms by default

def add_books(request):
    if request.method == 'POST':
        formset = BookFormSet(request.POST)
        if formset.is_valid():
            for form in formset:
                if form.cleaned_data:  # skip empty extra forms
                    title = form.cleaned_data['title']
                    price = form.cleaned_data['price']
                    Book.objects.create(title=title, price=price)
    else:
        formset = BookFormSet()
    return render(request, 'add_books.html', {'formset': formset})

# ModelFormSet - tied to a model, similar to ModelForm but for MULTIPLE instances
BookModelFormSet = modelformset_factory(Book, fields=['title', 'price'], extra=2)

def edit_books(request):
    if request.method == 'POST':
        formset = BookModelFormSet(request.POST, queryset=Book.objects.filter(available=True))
        if formset.is_valid():
            formset.save()  # saves ALL forms (creates new, updates existing)
    else:
        formset = BookModelFormSet(queryset=Book.objects.filter(available=True))
    return render(request, 'edit_books.html', {'formset': formset})

<!-- Template rendering a formset -->
<form method='post'>
    {% csrf_token %}
    {{ formset.management_form }}  <!-- REQUIRED - tracks form count for validation -->
    {% for form in formset %}
        {{ form.as_p }}
    {% endfor %}
    <button type='submit'>Save All</button>
</form>

# Inline formsets - for editing related objects together (e.g. Author + their Books)
from django.forms import inlineformset_factory
BookInlineFormSet = inlineformset_factory(Author, Book, fields=['title', 'price'], extra=2)

Formsets एक page पर same form की कई instances manage करते हैं - जब user को कई related items एक साथ submit करने हों तब उपयोगी है।

from django import forms
from django.forms import formset_factory, modelformset_factory

class BookForm(forms.Form):
    title = forms.CharField(max_length=200)
    price = forms.DecimalField()

BookFormSet = formset_factory(BookForm, extra=3)

def add_books(request):
    if request.method == 'POST':
        formset = BookFormSet(request.POST)
        if formset.is_valid():
            for form in formset:
                if form.cleaned_data:
                    title = form.cleaned_data['title']
                    price = form.cleaned_data['price']
                    Book.objects.create(title=title, price=price)
    else:
        formset = BookFormSet()
    return render(request, 'add_books.html', {'formset': formset})

BookModelFormSet = modelformset_factory(Book, fields=['title', 'price'], extra=2)

def edit_books(request):
    if request.method == 'POST':
        formset = BookModelFormSet(request.POST, queryset=Book.objects.filter(available=True))
        if formset.is_valid():
            formset.save()
    else:
        formset = BookModelFormSet(queryset=Book.objects.filter(available=True))
    return render(request, 'edit_books.html', {'formset': formset})

<!-- Template -->
<form method='post'>
    {% csrf_token %}
    {{ formset.management_form }}
    {% for form in formset %}
        {{ form.as_p }}
    {% endfor %}
    <button type='submit'>Save All</button>
</form>

from django.forms import inlineformset_factory
BookInlineFormSet = inlineformset_factory(Author, Book, fields=['title', 'price'], extra=2)

Was this answer clear?