Django Formset.is_valid () не работает для дополнительных форм - PullRequest
15 голосов
/ 29 мая 2009

В моем приложении Django у меня есть набор форм, который создается из простой (не модели) формы с дополнительным = 1 (чтобы позволить javasript добавить больше форм позже).

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)

Теперь, когда я создаю и пытаюсь проверить его в моем представлении на запрос POST:

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

if(my_formset.is_valid()):
    # FAIL

всегда проходит проверку выше, если представленная форма extra представляется пустой.

Если я проверю form.changed_data в последней пустой дополнительной форме, я получу поля с возможностью выбора (например, pickme выше). Другими словами, набор форм недостаточно умен, чтобы понять, что пустая отправленная форма должна игнорироваться, когда требуются поля выбора.

Ответы [ 2 ]

22 голосов
/ 01 июня 2009

Спасибо, Карл, ты привел меня, чтобы обнаружить корень моей проблемы.

При создании формы с полем выбора, которое является обязательным, мы должны установить начальное значение, иначе форма будет считать это поле измененным .

Итак, для такой формы:

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)

мы делаем это:

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

Затем, когда набор форм проверяет дополнительную форму, он увидит, что pickme имеет начальное значение A, и теперь это A, и сочтет его неизменным.

10 голосов
/ 30 мая 2009

Это не обычное поведение форм-наборов. Formsets pass empty_permitted = True для всех «лишних» форм , а форма с empty_permitted, которая не была изменена, всегда должна проходить проверку . Обратите внимание, что это прекрасно работает в админке Django (если вы используете inlines).

Вы, должно быть, делаете в своем коде что-то еще, что где-то нарушает это поведение. Разместите полный код соответствующей формы?

...