【问题标题】:Django formset cleaned_data empty when submitted form unchanged提交表单未更改时,Django formsetclean_data为空
【发布时间】:2012-04-14 23:30:45
【问题描述】:

关于 Django 1.4 和表单集,我遇到了一个奇怪的问题:当提交的数据不变时,即使表单集本身通过了验证,表单集的 clean_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 行会打印一个空字典列表,除非我实际上更改了字段中的初始值。

这对我来说似乎很奇怪,但我可能做错了什么。有什么帮助吗?

【问题讨论】:

  • 你能展示你的模板代码吗?

标签: python django formset


【解决方案1】:

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

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

【讨论】:

  • 刚刚帮我解决了一个令人头疼的问题——谢谢!
【解决方案2】:

这发生在我身上。 @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

【讨论】:

  • 感谢您提供代码 - 非常有帮助。之前碰到过这个问题,很气人!
猜你喜欢
  • 2014-07-19
  • 2016-09-23
  • 2012-03-09
  • 1970-01-01
  • 2013-04-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多