使用 django 1.4,我有一个没有初始实例的 ModelFormSet,extra 和 max 设置为 6:
# forms.py
ChildFormSet = modelformset_factory(Child, formset=FirstRequiredModelFormSet, exclude=('family_application', 'exported', 'index',), extra=6, max_num=6)
child_queryset = Child.objects.none()
当用户第一次访问该页面时,我使用 jquery 只显示一个空白表单(字段集)。用户可以按一个按钮来显示其余的表格。如果表单返回验证错误,我可以使用 jquery 查找具有类 errorlist 的字段集并显示所有这些字段集。但是,我还想显示任何包含有效数据的字段集。我可以检查每个字段集中的所有元素以查看它们是否具有值,但这似乎很笨拙。Django 知道表单何时发生更改,所以我想我会为这些表单添加一个前缀,以便我可以在 html 中发现它们:
class FirstRequiredModelFormSet(BaseModelFormSet):
def __init__(self, *args, **kwargs):
super(FirstRequiredModelFormSet, self).__init__(*args, **kwargs)
self.forms[0].empty_permitted = False
def clean(self):
super(FirstRequiredModelFormSet, self).clean()
for form in self.forms:
if form.has_changed():
form.prefix = '-'.join(('modified', form.prefix))
问题是我覆盖 clean() 的方式以某种方式导致提交的数据在表单返回错误时丢失(它返回时没有初始数据)。如果我通过首先检查验证错误来提前返回,如下所示:
def clean(self):
if any(self.errors):
return
super(FirstRequiredModelFormSet, self).clean()
for form in self.forms:
if form.has_changed():
form.prefix = '-'.join(('modified', form.prefix))
,数据仍然存在,但当然不会添加前缀。我想过使用 is_bound 而不是 has_changed(),但似乎所有的表单从一开始都是绑定的,我猜是因为它们是 ModelForms。
任何想法为什么覆盖 BaseModelFormSet.clean() 添加前缀会导致返回表单的初始数据丢失?