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_formfor formsets to validate. -
Use
can_delete=Trueto allow items to be marked for deletion. -
Access cleaned data with
formset.cleaned_data. -
Use
formset.formsto access individual form instances. -
Use
formset.errorsto access formset-level errors.