Formsets Example

A snippet showing how to use Django formsets.


# forms.py

from django import forms
from django.forms import formset_factory

class ItemForm(forms.Form):
    name = forms.CharField(max_length=50)
    quantity = forms.IntegerField(min_value=1)

ItemFormSet = formset_factory(ItemForm, extra=2, can_delete=True)
      

# views.py

from django.shortcuts import render, redirect
from .forms import ItemFormSet

def order_items(request):
    if request.method == "POST":
        formset = ItemFormSet(request.POST)
        if formset.is_valid():
            items = [f.cleaned_data for f in formset.forms if f.cleaned_data and not f.cleaned_data.get("DELETE")]
            # Process items...
            return redirect("order-items")
    else:
        formset = ItemFormSet()
    return render(request, "order_items.html", {"formset": formset})
      

<!-- templates/order_items.html -->

<form method="post" class="bg-white border rounded p-3">
  {% csrf_token %}
  {{ formset.management_form }}
  {% for form in formset %}
    <div class="border rounded p-2 mb-2">
      {{ form.as_p }}
    </div>
  {% endfor %}
  <button type="submit" class="btn btn-primary">Submit</button>
</form>
      
Explanation:
  • Always render management_form for formsets to validate.
  • Use can_delete=True to allow items to be marked for deletion.
  • Access cleaned data with formset.cleaned_data.
  • Use formset.forms to access individual form instances.
  • Use formset.errors to access formset-level errors.
Never miss a story on Django.wiki

Subscribe for fresh tutorials, snippets, and updates.

By subscribing you agree to our Privacy Policy.