Django Formset.is_valid() не работает с дополнительными формами

В моем приложении приложения 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

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

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


person Andriy Drozdyuk    schedule 29.05.2009    source источник


Ответы (2)


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

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

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

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, и будет считать его неизменным.

person Andriy Drozdyuk    schedule 01.06.2009
comment
У меня похоже та же ошибка, но предоставление инициала на самом деле не решило проблему. Вы уверены, что именно это решило вашу проблему? - person ricree; 01.09.2009
comment
Нет, но это исправило. - person Andriy Drozdyuk; 03.09.2009
comment
а что, если я не хочу указывать начальное значение поля? - person dzida; 01.08.2010
comment
Тогда я не могу помочь тебе, мой друг. Это было год назад, и какое-то время я не использовал формы. Дайте мне знать, если вам удастся ее решить. - person Andriy Drozdyuk; 12.10.2010

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

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

person Carl Meyer    schedule 30.05.2009
comment
Спасибо, я посмотрю и вернусь к вам - person Andriy Drozdyuk; 30.05.2009
comment
Оказывается, это связано с полем выбора, поскольку form.changed_data содержит все мои поля выбора, в которых нет пустой записи. Я обновляю вопрос, чтобы отразить это. У меня все еще нет хорошего решения. - person Andriy Drozdyuk; 01.06.2009