from django.forms import modelformset_factory
from django.shortcuts import render, redirect
from .models import Product
def bulk_edit_products(request):
ProductFormSet = modelformset_factory(
Product,
fields=['name', 'price', 'stock'],
extra=0,
can_delete=True
)
if request.method == 'POST':
formset = ProductFormSet(request.POST, queryset=Product.objects.all())
if formset.is_valid():
formset.save()
return redirect('products:list')
else:
formset = ProductFormSet(queryset=Product.objects.all())
return render(request, 'products/bulk_edit.html', {'formset': formset})
from django.forms import inlineformset_factory
from django.shortcuts import render, get_object_or_404, redirect
from .models import Order, OrderItem
def edit_order(request, order_id):
order = get_object_or_404(Order, id=order_id)
OrderItemFormSet = inlineformset_factory(
Order,
OrderItem,
fields=['product', 'quantity', 'price'],
extra=1,
can_delete=True
)
if request.method == 'POST':
formset = OrderItemFormSet(request.POST, instance=order)
if formset.is_valid():
formset.save()
return redirect('orders:detail', order_id=order.id)
else:
formset = OrderItemFormSet(instance=order)
return render(request, 'orders/edit.html', {
'order': order,
'formset': formset
})
Formsets handle multiple forms on one page. I use modelformset_factory for editing existing objects and inlineformset_factory for related objects. The extra parameter controls empty forms shown. I validate formsets with formset.is_valid() and save with formset.save(). For better UX, I add JavaScript to dynamically add/remove forms. The can_delete option adds delete checkboxes. This pattern is perfect for bulk editing or managing one-to-many relationships in a single view. I'm careful with max_num to prevent abuse.