python / intermediate
Snippet
Django Formsets for Dynamic Form Handling
Formsets allow you to handle multiple forms of the same type simultaneously, perfect for scenarios like order items where you need to add multiple products. Django's formset_factory creates a formset class that manages validation, cleaning, and tracking of extra/delete forms. The validate_min and min_num parameters enforce that at least one item must be present.
snippet.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
from django import formsfrom django.forms import formset_factoryfrom crispy_forms.helper import FormHelperfrom crispy_forms.layout import Layout, Fieldclass OrderItemForm(forms.Form):product = forms.CharField(max_length=100)quantity = forms.IntegerField(min_value=1, max_value=99)price = forms.DecimalField(max_digits=10, decimal_places=2)class OrderForm(forms.Form):customer_name = forms.CharField(max_length=100)items = formset_factory(OrderItemForm, extra=1, min_num=1)def process_order(request):OrderFormSet = formset_factory(OrderItemForm,extra=2,max_num=10,min_num=1,validate_min=True)formset = OrderFormSet(request.POST)if formset.is_valid():total = sum(float(item.cleaned_data['quantity']) *float(item.cleaned_data['price'])for item in formset.formsif item.is_valid())return totalhelper = FormHelper()helper.layout = Layout(Field('product'),Field('quantity'),Field('price'))return None
django
Breakdown
1
formset_factory(OrderItemForm, extra=1, min_num=1)
Create a formset with 1 extra empty form and require minimum 1 form
2
validate_min=True
Enforce min_num validation and show error if below minimum
3
for item in formset.forms if item.is_valid()
Iterate only through valid forms to calculate total safely
4
max_num=10
Limit maximum number of forms to prevent abuse