【问题标题】:Django Formset.is_valid() failing for extra formsDjango Formset.is_valid() 额外表单失败
【发布时间】:2010-10-29 23:34:25
【问题描述】:

在我的 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

如果 extra 呈现的表单提交为空,则始终无法通过上述检查。

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

【问题讨论】:

    标签: django django-forms formset


    【解决方案1】:

    这不是表单集的常见行为。 Formsets pass empty_permitted=True to all "extra" formsa form with empty_permitted that hasn't been modified should always pass validation。请注意,这在 Django 管理员中运行良好(如果您使用内联)。

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

    【讨论】:

    • 谢谢,我会调查并回复你
    • 事实证明这是由于选择字段,因为 forms.changed_data 包含我所有没有“空”条目的选择字段。我更新了问题以反映这一点。不过我还是没有好的解决办法。
    【解决方案2】:

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

    当创建带有选择字段的表单时,这是必需的,我们必须设置一个initial值,否则表单会认为该字段已更改

    所以对于这样的表格:

    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,并且会认为它没有改变。

    【讨论】:

    • 我遇到了似乎是相同的错误,但提供首字母并没有真正解决问题。你确定那是真正解决你的问题的原因吗?
    • 不,但这就是修复它的原因。
    • 如果我不想提供字段的初始值怎么办?
    • 那我帮不了你我的朋友。这是一年前的事了——我有一段时间没有使用表格了。如果你设法解决它,请告诉我。
    猜你喜欢
    • 2013-07-15
    • 2012-06-19
    • 2017-04-02
    • 1970-01-01
    • 2018-01-04
    • 2011-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多