2009-05-29 10 views
10

W mojej aplikacji aplikacji Django mam formset, który jest tworzony z prostej (nie-modelowej) postaci, z dodatkowym = 1 (aby umożliwić javasriptowi dodawanie kolejnych formularzy później).Django Formset.is_valid() kończy się niepowodzeniem dla dodatkowych formularzy

class SomeForm(forms.Form): 
    #some fields with required=False 
    length = forms.IntegerField(required=False) 

    # An example of one of the fields with choices i have 
    A = 0 
    B = 1 
    C = 2 
    D = 3 

    choices = ((A, 'Aah'), (B, 'Baa'), (C, 'Caa'), (D, 'Daa')) 

    # This is a required choice field 
    pickme = forms.ChoiceField(choices=choices) 


SomeFormset = formset_factory(SomeForm, can_delete=True, extra=1) 

Teraz, gdy tworzę i starają się potwierdzić to w moim przekonaniu na żądanie POST:

my_formset = SomeFormset(request.POST, request.FILES) 

if(my_formset.is_valid()): 
    # FAIL 

zawsze zawiedzie powyższy czek, jeśli extra renderowane formularz jest składany pusty.

Jeśli sprawdzę na form.changed_data na ostatnim pustym formularzu dodatkowym, otrzymam pola, które mają do wyboru (np. pickme powyżej). Innymi słowy, zestaw nie jest wystarczająco inteligentny, aby stwierdzić, że pusty przesłany formularz powinien zostać zignorowany, gdy wymagane są pewne pola wyboru.

Odpowiedz

18

Dzięki Carl, doprowadziłeś mnie do odkrycia źródła mojego problemu.

Tworząc formularz z polem wyboru, które są wymagane, musimy ustawić wartość początkową, inaczej forma uzna, że ​​pole zmienił.

Więc dla postaci jak ten:

class SomeForm(forms.Form): 

    A = 0 
    B = 1 
    C = 2 
    D = 3 

    choices = ((A, 'Aah'), (B, 'Baa'), (C, 'Caa'), (D, 'Daa')) 

    # This is a required choice field 
    pickme = forms.ChoiceField(choices=choices) 

robimy to:

pickme = forms.ChoiceField(choices=choices, initial=A) 

Wtedy gdy formset sprawdza dodatkowy formularz będzie widzieć, że pickme miał wartości początkowej, a to jest teraz również i uzna to za niezmienione.

+0

Mam coś, co wydaje się być tym samym błędem, ale podanie początkowej wersji nie rozwiązało problemu. Czy jesteś pewien, że to właśnie naprawiło twój problem? – ricree

+0

Nie, ale to właśnie naprawiło. – drozzy

+0

Ta odpowiedź rozwiązała problem, który miałem. Dzięki! – fholo

9

To nie jest zwykłe zachowanie formularzy. Formsets pass empty_permitted=True to all "extra" forms i a form with empty_permitted that hasn't been modified should always pass validation. Zauważ, że działa to dobrze w administratorze Django (jeśli używasz inlines).

Musisz zrobić coś innego w kodzie, który łamie to zachowanie gdzieś. Opublikuj pełny kod odpowiedniego formularza?

+0

Dzięki Wezmę to i skontaktuję się z Tobą – drozzy

+0

Okazuje się, że jest to spowodowane polem wyboru, ponieważ forms.changed_data zawiera wszystkie moje pola wyboru, które nie mają "pustego" wpisu. Aktualizuję pytanie, aby to odzwierciedlić. Wciąż nie mam dobrego rozwiązania. – drozzy

+0

Rozgryzłem to! Dzięki! – drozzy

Powiązane problemy