Ich finde die Django-Formsets wirklich verwirrend.
Ich habe besonders Probleme mit den folgenden Konzepten, die ich nicht wirklich verstehe:
Das Formset ist intelligent genug, um zusätzliche Formulare zu ignorieren, die dies nicht waren geändert.
Über Code sprechen, der versucht, zu schlau zu sein. Was soll das genau heißen? Warum sollte ich das überhaupt wollen?
Wenn ich versuche, das vorherige Konzept zu verstehen, sehe ich Leute
Erstellen von Formularen in den erforderlichen Formsets.
Dies ist ein anderes Konzept, das ich nicht verstehen kann. Was ist ein erforderliches Formular in einem Formularsatz und warum muss ich ein Formular erforderlich machen? Wieder etwas nicht dokumentiert.
Dann kommen wir zu meinem eigentlichen Problem, das andere Leute anscheinend hatten, aber sie können nicht wirklich erklären, warum sie es so korrigiert haben, wie sie es behoben haben.
Warum ist das Formset im folgenden Beispiel gültig, während ein einzelnes Formular mit derselben Eingabe ungültig ist?
%Vor%Die Einstellung von empty_permitted auf False scheint die erwarteten Ergebnisse für mich zu ergeben (was daran liegt, dass das Formset aufgrund fehlender 'start' und 'end' ungültig ist). Dies ist ein weiteres undokumentiertes Feature ...
Würde jemand Zeit für eine Erklärung haben?
Danke
Das Formset ist intelligent genug, um zusätzliche Formulare zu ignorieren, die nicht geändert wurden.
Über Code sprechen, der versucht, zu schlau zu sein. Was soll das genau heißen? Warum sollte ich das überhaupt wollen?
Es scheint so zu sein - wie Sie herausgefunden haben, dass "extra" -Formulare, die durch das Formset (mit extra=N
in Ihrem Beispiel) erstellt wurden, empty_permitted
auf True
gesetzt haben. Werfen Sie einen Blick auf django/forms/formsets.py
, um dies zu sehen passiert.
formset[0].empty_permitted
bedeutet, dass bei formset[0].has_changed() == False
keine weitere Verarbeitung / Validierung erfolgt. Nochmal, Sie können dies in Aktion sehen in forms/forms.py
.
Um dies zu verhindern schlägt einen Blog-Post vor Definieren eines benutzerdefinierten Formsets zur Verwendung in modelformset_factory
(oder inlineformset_factory
), das empty_permitted = False
:
Ich habe das nicht getestet, aber es sieht echt aus.
Warum jemand dies möchte, macht es zu verwenden
django-dynamic-formset
viel einfacher - Sie können Daten für form-0
und form-2
und, vorausgesetzt, senden form-1
war ein zusätzliches Formular ( dh nicht mit Modelldaten verknüpft), Django wird sich nicht beschweren. Wenn empty_permitted
standardmäßig False
wäre, müssten Sie sich darum sorgen, das leere Formular in Ihrem eigenen Code zu überspringen oder Dinge in Javascript neu zu indizieren.
Tags und Links django django-forms