所以我有一个由django.forms.inlineformset_factory创建的django内联formset,它包含一个父:ParentCount和child:ChildCount。
在ChildCount表单中,我已经重写了clean方法:
class ChildCountForm(ModelForm):
class Meta:
model = ChildCount
exclude = ["name"]
def clean(self):
cleaned_data = super(ChildCountForm, self).clean()
att1 = cleaned_data.get("att1")
att2 = cleaned_data.get("att2")
if att1 == "I3i" and att2 is None:
msg = "Require att2 information for I3i attribute"
self._errors['att2'] = self.error_class([msg])
"""Returns the cleaned data"""
return cleaned_data
我认为这将在formset中调用每个ChildForm,因为inlineformset_factory是使用自定义表单类定义的,它使用逻辑:
class CustomInlineFormset(BaseInlineFormSet):
"""used to pass in the constructor of inlineformset_factory"""
def clean(self):
"""forces each clean() method on the ChildCounts to be called"""
super(BaseInlineFormSet, self).clean()
for form in self.forms:
form.clean()
ChildFormSet = inlineformset_factory(ParentCount, ChildCount,
form=ParentCountForm,
extra=1,
max_num=30,
formset=CustomInlineFormset)
但是,在表单的这一点上,每个表单的clean方法()不是从ChildCountForm派生的,它是从BaseModelForm派生的。如果我在pdb中的那一行实例化一个空的ChildCountForm,它表示它从ChildCountForm派生出clean方法,但self.forms中的'form'对象却没有。这是为什么?
如何让我的自定义clean()方法为每个ChildForm运行?
答案 0 :(得分:1)
你误解了inlineformset_factory
正在做什么。它为子表单创建formset,因此如果要指定自定义表单,则应在ChildCountForm中传递。
另请注意,调用每个表单的clean方法是默认行为,因此不需要覆盖formset来执行此操作。