在处理动态formset时,有时TOTAL_FORMS大于实际的表单数。此外,用户可以轻松修改此输入TOTAL_FORMS 例如,我的输入是
<input name='user-TOTAL_FORMS' type='hidden' value='5'/>
但是,只显示了2个实际表格。
在这种情况下,Django会在formset.forms变量中生成不需要的空表单。如果存在任何验证错误并再次显示表单,则会产生问题。页面显示那些不需要的表单(在示例中,只显示2个实际表单,但由于总计数为5,用户总共可以看到5个表单)
如何删除这些不需要的表单,更新我的总计数并使用更新的formset重新显示表单?
编辑: 具有挑战性的部分是在删除表单时更新索引。因此总表单数与最后一个表单索引匹配。
答案 0 :(得分:0)
这是一个老问题,我不确定Django自那以后是否发生了很大变化。但我最终做的方式是编写一个函数来更新formset数据。这里的关键是首先复制formset数据(QueryDict)。这是代码:
def updateFormDataPrefixes(formset):
"""
Update the data of the formset to fix the indices. This will assign
indices to start from 0 to the length. To do this requires copying
the existing data and update the keys of the QueryDict.
"""
# Copy the current data first
data = formset.data.copy()
i = 0
nums = []
for form in formset.forms:
num = form.prefix.split('-')[-1]
nums.append(num)
# Find the keys for this form
matched_keys = [key for key in data if key.startswith(form.prefix)]
for key in matched_keys:
new_key = key.replace(num, '%d'%i)
# If same key just move to the next form
if new_key == key:
break
# Update the form key with the proper index
data[new_key] = data[key]
# Remove data with old key
del data[key]
# Update form data with the new key for this form
form.data = data
form.prefix = form.prefix.replace(num, '%d'%i)
i += 1
total_forms_key = formset.add_prefix(TOTAL_FORM_COUNT)
data[total_forms_key] = len(formset.forms)
formset.data = data
答案 1 :(得分:-2)
大声笑,这仍然是个老问题,但是真正的答案是“添加extra=0
属性,因为默认的extra
定义为3”
LinkFormSet = inlineformset_factory(
ParentModel,
ChildModel,
fields = ('price', 'deadline',),
extra=0
)
此处提供了更多文档:https://docs.djangoproject.com/en/2.1/ref/forms/models/#django.forms.models.inlineformset_factory