Django表单集,如果总表单数与实际表单数不同

Django表单集,如果总表单数与实际表单数不同,django,django-forms,Django,Django Forms,在处理动态表单集时,有时总表单数大于实际表单数。此外,用户可以轻松地修改此输入表格。 例如,我的输入是 <input name='user-TOTAL_FORMS' type='hidden' value='5'/> 但是,仅显示两个实际表单 在这种情况下,Django会在formset.forms变量中生成不需要的空表单。如果存在任何验证错误,并且表单再次显示,则会产生问题。页面显示了那些不需要的表单。(在本例中,只应显示2个实际表单,但由于总计数为5,用户将看到总共5个表单

在处理动态表单集时,有时总表单数大于实际表单数。此外,用户可以轻松地修改此输入表格。
例如,我的输入是

<input name='user-TOTAL_FORMS' type='hidden' value='5'/>

但是,仅显示两个实际表单

在这种情况下,Django会在formset.forms变量中生成不需要的空表单。如果存在任何验证错误,并且表单再次显示,则会产生问题。页面显示了那些不需要的表单。(在本例中,只应显示2个实际表单,但由于总计数为5,用户将看到总共5个表单)

如何删除这些不需要的表单,更新我的总计数,并使用更新的表单集重新显示表单

编辑:
挑战的部分是在删除表单时更新索引。因此,总表单计数与最后一个表单索引匹配

这是一个老问题,我不确定自那以后Django是否发生了很大变化。但我最终的做法是编写一个函数来更新表单集数据。这里的关键是首先复制表单集数据(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

哈哈,这还是个老问题,但真正的答案是“添加
extra=0
属性,因为默认的
extra
定义是3”

此处提供了更多文档:

LinkFormSet = inlineformset_factory(
    ParentModel, 
    ChildModel,  
    fields = ('price', 'deadline',), 
    extra=0
)