gpt4 book ai didi

Django Formset.is_valid() 因额外表单而失败

转载 作者:行者123 更新时间:2023-12-03 02:00:50 27 4
gpt4 key购买 nike

在我的 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 请求的 View 中验证它时:

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

if(my_formset.is_valid()):
# FAIL

如果额外呈现的表单提交为空,则上述检查总是失败。

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

最佳答案

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

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

对于这样的表单:

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

关于Django Formset.is_valid() 因额外表单而失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/927619/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com