2012-12-06 11 views
8

Naprawdę znajduję mylące formidy django.django formsets confusion (sprawdzanie poprawności, wymagane, empty_permitted)

jestem szczególnie problemy z następujących pojęć, które tak naprawdę nie rozumieją:

formset jest wystarczająco inteligentny, aby ignorować niektóre formy, które nie zostały zmieniły.

Mówienie o kodzie, który próbuje być zbyt sprytny. Co to dokładnie znaczy? Dlaczego miałbym tego chcieć?

Potem, próbując zrozumieć poprzednią koncepcję, widzę ludzi

tworzenia formularzy do formsets wymagane.

To kolejna koncepcja, której nie mogę się pozbyć. Co to jest wymagana forma w zestawie i dlaczego muszę utworzyć wymagany formularz? Znowu coś, czego nie udokumentowano.

Potem przychodzę do mojego rzeczywistego problemu, który inni ludzie zdają się mieć, ale nie potrafią wyjaśnić, dlaczego naprawili go tak, jak go naprawili.

Dlaczego w poniższym przykładzie zestaw jest ważny, a indywidualny formularz z tym samym wpisem jest nieprawidłowy?

import django 
class MyForm(django.forms.Form): 
    start = django.forms.DateField() 
    end = django.forms.DateField() 

data = { 
    'form-TOTAL_FORMS': '1', 
    'form-MAX_NUM_FORMS': '', 
    'form-INITIAL_FORMS': '0', 
    'form-0-start': '', 
    'form-0-end': '', 
} 

MyFormSet = formset_factory(MyForm) 
formset = MyFormSet(data) 
#fee_forms[0].empty_permitted = False 

print formset.is_valid() 
# --- returns True --- 
print formset.errors 

f = MyForm({'start': '', 'end': ''}) 
print f.is_valid() 
# --- returns False --- 
print f.errors 

Ustawienie empty_permitted False wydaje się dawać oczekiwanych rezultatów dla mnie (co jest dla formset za nieważne z powodu braku „Start” i „end”). To kolejna nieudokumentowana funkcja ...

Czy ktokolwiek poświęci trochę czasu na wyjaśnienia?

Dziękuję

Odpowiedz

12

formset jest wystarczająco inteligentny, aby ignorować niektóre formy, które nie były zmieniane.

Mówienie o kodzie, który próbuje być zbyt sprytny. Co to dokładnie znaczy? Dlaczego miałbym tego chcieć?

Wydaje oznaczać - jak to działało - że „dodatkowe” formy stworzone przez formset (z extra=N w Twojej przykład) mają empty_permitted zestaw do True. Have a glance at django/forms/formsets.py, aby zobaczyć, jak to się dzieje.

formset[0].empty_permitted oznacza, że ​​jeśli formset[0].has_changed() == False, dalsze przetwarzanie/sprawdzanie nie jest wykonywane. Ponownie, you can see this in action in forms/forms.py.

Aby temu zapobiec, a blog post suggests definiowania niestandardowego formset do wykorzystania w modelformset_factory (lub inlineformset_factory), która ustanawia empty_permitted = False:

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

nie testowałem, ale wygląda legit.

Jako dlaczego ktoś może chcieć tego, to sprawia, że ​​korzystanie django-dynamic-formset znacznie prostsze - można przesłać dane do form-0 i form-2 i zakładając form-1 był dodatkowy formularz (tj nie związany do modelowania danych), Django wygrał” narzekać. Jeśli domyślnie empty_permitted byłby False, musiałbyś się martwić o pominięcie pustego formularza we własnym kodzie lub ponowne indeksowanie rzeczy w JavaScript.

Powiązane problemy