16

在我的 Django 应用程序应用程序中,我有一个从简单(非模型)表单创建的表单集,其中 extra=1(以允许 javasript 稍后添加更多表单)。

class SomeForm(forms.Form):
    #some fields with required=False
    length = forms.IntegerField(required=False)

    # An example of one of the fields with choices i have
    A = 0
    B = 1
    C = 2
    D = 3

    choices = ((A, 'Aah'), (B, 'Baa'), (C, 'Caa'), (D, 'Daa'))

    # This is a required choice field
    pickme = forms.ChoiceField(choices=choices)


SomeFormset = formset_factory(SomeForm, can_delete=True, extra=1)

现在,当我在 POST 请求的视图中创建并尝试验证它时:

my_formset = SomeFormset(request.POST, request.FILES)

if(my_formset.is_valid()):
    # FAIL

如果额外呈现的表单提交为空,它总是无法通过上述检查。

如果我检查form.changed_data最后一个空的额外表单,我会得到可以选择的字段(如上面的pickme)。换句话说,当需要一些选择字段时,表单集还不够聪明,无法确定应该忽略提交的空表单。

4

2 回答 2

25

谢谢卡尔,你让我发现了我的问题的根源。

在创建带有选项字段的表单时,这是必需的,我们必须设置一个初始值,否则表单将认为该字段已更改

所以对于这样的表格:

class SomeForm(forms.Form):

    A = 0
    B = 1
    C = 2
    D = 3

   choices = ((A, 'Aah'), (B, 'Baa'), (C, 'Caa'), (D, 'Daa'))

    # This is a required choice field
    pickme = forms.ChoiceField(choices=choices)

我们这样做:

pickme = forms.ChoiceField(choices=choices, initial=A)

然后当一个表单集检查额外的表单时,它会看到 pickme 的初始值是 A,现在也是 A,并且会认为它没有改变。

于 2009-06-01T13:04:47.660 回答
10

这不是表单集的常见行为。 表单集将 empty_permitted=True 传递给所有“额外”表单,并且未修改的带有 empty_permitted 的表单应始终通过验证。请注意,这在 Django 管理员中工作得很好(如果您使用内联)。

您必须在代码中执行其他操作,从而在某处破坏此行为。贴出相关表格的完整代码?

于 2009-05-30T02:38:03.150 回答