python / intermediate
Snippet
Django Formsets für Dynamische Formularverarbeitung
Formsets ermöglichen die gleichzeitige Verarbeitung mehrerer Formulare desselben Typs, perfekt für Szenarien wie Bestellpositionen wo mehrere Produkte hinzugefügt werden müssen. Djangos formset_factory erstellt eine Formset-Klasse, die Validierung, Bereinigung und Verfolgung von extra/delete-Formularen verwaltet. Die Parameter validate_min und min_num erzwingen dass mindestens ein Element vorhanden sein muss.
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
Erklärung
1
formset_factory(OrderItemForm, extra=1, min_num=1)
Erstelle ein Formset mit 1 extra leerem Formular und erfordere Minimum 1
2
validate_min=True
Erzwinge min_num Validierung und zeige Fehler wenn Minimum unterschritten
3
for item in formset.forms if item.is_valid()
Iteriere nur durch valide Formulare um Total sicher zu berechnen
4
max_num=10
Begrenze maximale Anzahl an Formularen um Missbrauch zu verhindern