django formsets Verwirrung (Validierung, erforderlich, empty_permitted)

8

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

    
Cricri 06.12.2012, 14:09
quelle

1 Antwort

12
  
    

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 :

setzt %Vor%

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.

    
supervacuo 01.06.2013, 23:05
quelle

Tags und Links