我有一个页面,显示多个表单集,每个表单集都有一个前缀。使用formset_factory
默认选项(包括extra=1
)创建表单集。可以使用JavaScript添加或删除行。
如果用户正在添加新数据,则会显示一个空白行。完美的。
如果用户已添加数据,但表单验证失败,则在这种情况下,表单集将使用MyFormset(data, prefix='o1-formsetname')
等填充POST数据,仅显示他们输入的数据。再次,完美。 (o1
等是动态生成的,每个o
对应于一个“选项”,每个“选项”可以具有多个表单集)。
但是,如果用户正在编辑现有数据,则在这种情况下, View 将使用MyFormset(initial=somedata, prefix='o1-formsetname')
填充表单集,其中somedata
是数据库中来自模型的数据字典的列表,在该数据之后会插入一个额外的空白行。我不希望出现空白行,除非用户使用JavaScript显式添加一行。
如果设置了初始数据,是否有任何简单的方法可以防止表单集显示额外的行?我在第三个示例中使用initial
的原因是,如果我只是使用MyFormset(somedata, prefix='o1-formsetname')
传递了数据,则必须执行一个额外的步骤,将所有数据重新格式化为POSTdata样式dict,包括每个字段的前缀,例如o1-formsetname-1-price: x
等等,以及计算管理表格数据,这增加了整个复杂的负担。
一种解决方案是在将表单集发送到模板之前对其进行拦截,然后手动删除该行,但是extra_forms
属性似乎不可写,并且将extra
设置为0
并没有任何区别。我也可以让JavaScript检测到这种情况并删除该行。但是我不禁觉得我缺少明显的东西,因为我想要的行为对我来说似乎是明智的预期行为。
谢谢。
最佳答案
使用max_num
关键字参数作为formset_factory
:
MyFormset = formset_factory([...], extra=1, max_num=1)
有关更多详细信息,请查看limiting the maximum number of forms。
顺利完成:大概您希望能够处理多个空白表格。这并不难;只要确保您在POST处理端不使用
max_num
关键字参数即可。关于Django formset-仅在没有初始数据集的情况下显示额外字段?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7363256/