我有一个继承自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
重置为在管理界面中可见的实际数量的嵌入式面板?还是应该在其他地方进行验证?
经过更多挖掘,我找到了答案。在form
的cleaned_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