Django formset cleaned_data пусто при отправке формы без изменений - PullRequest
4 голосов
/ 31 марта 2012

У меня возникла странная проблема, связанная с Django 1.4 и наборами форм: когда отправленные данные неизменны, поле cleaned_data в наборе форм пусто, даже если сам набор форм проходит проверку.

Вот пример:

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())

Хотя formset является действительным и фактически содержит данные, в строке 3 выводится список пустого словаря, если только я фактически не изменил начальное значение в поле.

Мне это кажется странным, но я, вероятно, что-то делаю не так. Любая помощь?

Ответы [ 2 ]

6 голосов
/ 31 марта 2012

Набор форм отображает множество форм, а также несколько скрытых полей ввода, содержащих информацию, такую ​​как максимальное количество форм.Таким образом, правильно сформированный POST-набор всегда содержит данные.

И начальный 'Foo' внутри CharField name является причиной того, что formset получил пустой словарь.Если для empty_permitted формы установлено значение True, а все элементы формы равны ее начальному значению, Django будет обрабатывать форму как пустую и устанавливать ее cleaned_data как пустую переменную.empty_permitted по умолчанию равно False, formset установит его в True для дополнительных форм.Таким образом, после того, как вы щелкнули «Отправить» без редактирования значения «Foo», экземпляр формы был обработан как пустой, поэтому набор форм, обертывающий форму, получил пустые cleaned_data.

0 голосов
/ 18 декабря 2013

Это случилось со мной. @okm верен, но из его ответа не ясно, как это исправить. См. этот ответ для решения:

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