<p>嗯,我对蒂姆·埃德加的解决方案还是不太满意,所以我一直在寻找。我想我找到了我要找的东西。
“Form”类有两个在本例中使用的未记录方法:“has_changed()”和“u get_changed_data”。在</p>
<p>在ModelFormSet验证过程中,每个表单检查“has\u changed()”。如果表单未更改,则跳过验证并假定表单正确。
同样,在保存ModelFormSet期间,save_new_对象会检查每个表单是否已更改。如果没有更改,则不会保存表单。在</p>
<p>因此,我的解决方案是重写has_changed()方法,以便在只有“group”属性发生更改且所有其他字段都为空时返回False。这是我的实现:</p>
<pre><code>class UsesIngredientForm(forms.ModelForm):
class Meta:
model = UsesIngredient
def has_changed(self, *args, **kwargs):
self._get_changed_data(*args, **kwargs)
# If group is in changed_data, but no other fields are filled in, remove group so
# the form will not be validated or saved
if 'group' in self._changed_data and len(self._changed_data) == 1:
contains_data = False
for name in ['ingredient', 'amount', 'unit']:
field = self.fields[name]
prefixed_name = self.add_prefix(name)
data_value = field.widget.value_from_datadict(self.data, self.files, prefixed_name)
if data_value:
contains_data = True
break
if not contains_data:
self._changed_data.remove('group')
return bool(self._changed_data)
</code></pre>
<p>希望这对将来的任何人都有帮助!在</p>
<p>编辑:
我编辑这个答案是为了反映蒂姆·埃德加的评论。
我意识到这个实现仍然使用“private”方法,但是我还没有找到一个更干净的实现,只使用公开文档化的方法。但也许那只是我自己的无能。在</p>