当提交表单不变时,Django formset cleaning_data为空

时间:2012-03-31 15:31:59

标签: python django formset

我遇到了一个奇怪的问题,关于Django 1.4和formsets:当提交的数据没有改变时,formset的packaged_data字段为空,即使formset本身通过了验证。

以下是一个例子:

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 个答案:

答案 0 :(得分:5)

formset呈现一堆表单以及几个隐藏的输入字段,其中包含最大数量的表单等信息。因此,正确的POSTed表单集始终包含数据。

而且,CharField name中的初始'Foo'是formset获得空字典的原因。当表单的empty_permitted设置为True,并且表单的所有项都等于其初始值时,Django会将表单视为空,并将其cleaning_data设置为空dict。 empty_permitted默认为False,formset会将其设置为True以用于额外的表单。因此,在您单击提交未编辑值'Foo'后,表单实例被视为空,因此包装表单的formset得到一个空的cleaning_data。

答案 1 :(得分: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