gpt4 book ai didi

如果 TOTAL_FORMS 的数量与实际的表单数量不同,则 Django 表单集

转载 作者:行者123 更新时间:2023-12-01 06:53:17 25 4
gpt4 key购买 nike

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

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

但是,只显示了 2 个实际表单。

在这种情况下,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

关于如果 TOTAL_FORMS 的数量与实际的表单数量不同,则 Django 表单集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16469624/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com