Django Formset验证-Formset中的总和

时间:2019-01-07 10:56:20

标签: django django-forms django-views formset django-validation

我有一个包含Django表单的页面,然后在它下面有一个表单集(动态行数)。

在顶部窗体中是一个“总长度”字段,下面的表单集中的每一行都包含一个“长度”字段。我需要验证为表单集的每一行提交的长度总和<=顶部单个表单上的“总长度”字段。

我不认为我可以在构成表单集的表单上使用常规表单清理方法来执行此操作,因为该表单没有范围从表单集中的其他表单获取值。我想我可以在视图中代替它,但这是最好的方法吗?

编辑:

通过将验证逻辑放在视图中并遍历表单集来解决:

if form.is_valid() and formset.is_valid():
    total_sample_length = form.cleaned_data['total_length']
        if total_sample_length:
            sum_segment_lengths = 0
            for segment_form in formset:
                sum_segment_lengths += segment_form.cleaned_data['length']
            if sum_segment_lengths > total_sample_length:
                for segment_form in formset:
                    segment_form.add_error('length', 'Sum of Segment Lengths must be <= Total Length!')
                return render(request, template, {...})

1 个答案:

答案 0 :(得分:1)

您可以使用视图来处理此问题,并在顶部窗体上使用自定义的clean方法来引发总长度错误。

在视图上,您​​应该评估每个表单集表单,并获得总长度。

然后使用顶部表格进行检查,如果尺寸不适合您的尺寸,则会在清洁方面引发错误。