2012-03-31 102 views
3

我一直在经历着一个奇怪的问题,关于Django的1.4表单集:当提交的数据是不变的,该formset的cleaned_data字段为空,即使该formset本身通过验证。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()) 

虽然表单集是有效的,它实际上包含数据,第3行打印一个空字典的列表,除非我已经改变了字段中的初始值。

这似乎怪我,但我可能做错了什么?任何帮助?

+1

你能告诉你的模板代码? – 2012-03-31 15:37:28

回答

4

一个formset呈现的形式一堆以及诸如形式最大可能数量保持信息几个隐藏的输入字段。因此,一个正确的POST的表单总是包含数据。

而且,最初的“富”内CharField name是FORMSET了空字典的原因。当一个窗体的empty_permitted被设置为True,并且窗体的所有项都等于它的初始值时,Django会将窗体视为空,并将其清空数据设置为空字典。 empty_permitted默认为False,formset会将其设置为True用于额外的表单。因此,当您单击提交W/O编辑值'Foo'后,表单实例被视为空,因此包装表单的表单得到一个空的cleared_data。

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