我有一个页面,显示多个表单集,每个表单集都有一个前缀。使用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/

10-12 17:03
查看更多