如何在CreateView中验证许多inlineformset字段的总和?

时间:2018-04-13 08:53:47

标签: python django validation

我有一个模型的CreateView,其中包含另一个模型的inlineformset_factory(4行,每个子模型中的一个)。孩子的一个模特是'百分比'。现在它将bot保存为父模型和子模型,但我没有对百分比字段进行任何验证,因此用户可以轻松输入'11','34','02'和'0',它将保存它。

我想验证一下,在保存任何内容之前,百分比字段的总和是100%。我的forms.py看起来像这样:

class ParentForm(ModelForm):
    class Meta:
        model = Parent
        fields = ['name', 'observations']


class ChildCreateForm(ModelForm):
    class Meta:
        model = Child
        fields = ['percentage', 'material']

    def clean(self):
        cleaned_data = super(ChildCreateForm, self).clean()
        print(cleaned_data['percentage'])


ChildCreateFormCreateFormSet = inlineformset_factory(Parent, Child, form=ChildCreateForm, extra=4)

到目前为止,我可以单独验证每个百分比行,但我想验证总和。

我应该使用Javascript验证表单吗? Django有一种方法吗?或者最好是第三种选择?

1 个答案:

答案 0 :(得分:3)

您可以继承BaseInlineFormSet并覆盖clean方法。实例用干净的方法。

from django.forms import BaseInlineFormSet

class BaseChildFormSet(BaseInlineFormSet):
    def clean(self):
        super().clean()
        total_percentage = sum(f.cleaned_data['percentage'] for f in self.forms)
        if total_percentage != 100:
            raise forms.ValidationError("Total percentage must be 100")

然后在创建formset类时使用您的类。

ChildCreateFormCreateFormSet = inlineformset_factory(Parent, Child, form=ChildCreateForm, formset= BaseChildFormSet, extra=4)

有关详细信息,请参阅the docs