Wagtail:如何验证m2m内联模型?

问题描述 投票:0回答:1

我有一个继承自WagtailAdminPageForm的自定义表格,我想验证一个m2m模型字段(ClusterableModel)。现在,我在表单类上使用clean()方法。

def clean(self):
    cleaned_data = super().clean()
    my_field_total_sum = 0    
    for form in self.formsets['my_field'].forms:

        if form.is_valid():
            cleaned_form_data = form.clean()
            my_field_total_sum += cleaned_form_data.get('my_value')

            if total_sum > 100:
                form.add_error('my_value', 'More then 100 is not allowed')

    return cleaned_data

这很好,直到我在管理界面中添加和/或删除一些嵌入式面板并将页面另存为草稿并尝试再次验证。因为self.formsets['my_field'].forms仍然包含已删除的表单,并且永远不会重置为管理员中嵌入式面板的实际数量。

因此,是否可以将self.formsets['my_field'].forms重置为在管理界面中可见的实际数量的嵌入式面板?还是应该在其他地方进行验证?

django wagtail
1个回答
0
投票

经过更多挖掘,我找到了答案。在formcleaned_data字典中检查“ DELETE”键是关键。因此,我上面的clean方法需要看起来像这样:

def clean(self):
    cleaned_data = super().clean()
    my_field_total_sum = 0    
    for form in self.formsets['my_field'].forms:

        # simply check, if "DELETE" is not true
        if form.is_valid() and not form.cleaned_data.get("DELETE"): 
            cleaned_form_data = form.clean()
            my_field_total_sum += cleaned_form_data.get('my_value')

    # this check needs to be outside the loop ;-)
    if my_field_total_sum > 100:
        form.add_error('my_value', 'More then 100 is not allowed')

    return cleaned_data
© www.soinside.com 2019 - 2024. All rights reserved.