2012-03-31 12 views
3

Ich habe ein seltsames Problem in Bezug auf Django 1.4 und Formsets: Wenn die übergebenen Daten unverändert ist, ist das bereinigte_Data-Feld des Formularsatzes leer, auch wenn das Formularset selbst die Validierung besteht .Django formset cleaned_data leer, wenn eingereicht Formular unverändert

Hier ein Beispiel:

forms.py:

class NameForm(forms.Form): 
    name = forms.CharField(required=False, initial='Foo') 

views.py:

def welcome(request): 

    Formset = formset_factory(NameForm, extra=1) 
    if request.method == 'POST': 
     formset = Formset(request.POST) 
     print '1.Formset is valid?', formset.is_valid() 
     print '2.Formset', formset 
     print '3.Formset cleaned_data', formset.cleaned_data 
    else: 
     formset = Formset() 
    return render_to_response('template.html', locals()) 

Obwohl formset gültig ist, und es enthält tatsächlich Daten, Zeile 3 gibt eine Liste eines leeren Wörterbuchs aus, es sei denn, ich habe den Anfangswert in dem Feld tatsächlich geändert.

Das scheint mir seltsam, aber ich mache wahrscheinlich etwas falsch? Irgendeine Hilfe?

+1

Können Sie Ihren Vorlagencode anzeigen? –

Antwort

4

Ein Formularsatz enthält eine Reihe von Formularen sowie mehrere verborgene Eingabefelder mit Informationen wie der maximalen Anzahl von Formularen. Daher enthält ein korrekt POSTed Formset immer Daten.

Und die erste 'Foo' in CharField name ist der Grund, dass Formset leeres Wörterbuch bekommen hat. Wenn empty_permitted eines Formulars auf True gesetzt ist und alle Elemente des Formulars seinem Anfangswert entsprechen, behandelt Django das Formular als leer und legt seine gereinigten_Daten als leeres dict fest. Die empty_permitted Standardeinstellung ist False. Formset setzt es für zusätzliche Formulare auf True. Nachdem Sie also auf Senden geklickt haben, ohne den Wert 'Foo' zu bearbeiten, wurde die Formularinstanz als leer behandelt. Daher erhielt das Formular, das das Formular umbrachte, ein leeres cleaned_data.

0

Das ist mir passiert. @okm ist korrekt, aber es ist nicht klar aus seiner Antwort, wie es zu beheben ist. Siehe this answer für eine Lösung:

class MyModelFormSet(BaseModelFormSet): 
    def __init__(self, *args, **kwargs): 
     super(MyModelFormSet, self).__init__(*args, **kwargs) 
     for form in self.forms: 
      form.empty_permitted = False 
Verwandte Themen