2012-03-31 2 views
3

У меня возникла странная проблема, касающаяся django 1.4 и formsets: когда представленные данные не изменяются, поле cleaned_data набора форм пуст, даже если сам набор форм проходит проверку ,Django formset 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 печатает список пустого словаря, если я фактически не изменил начальное значение в поле.

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

+1

Можете ли вы показать свой код шаблона? –

ответ

4

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

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

0

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

class MyModelFormSet(BaseModelFormSet): 
    def __init__(self, *args, **kwargs): 
     super(MyModelFormSet, self).__init__(*args, **kwargs) 
     for form in self.forms: 
      form.empty_permitted = False 
Смежные вопросы