首页 > 解决方案 > 如何创建列数和行数未知的表单?

问题描述

我不知道我是否能够很好地解释这一点,所以请多多包涵,我会在需要的地方/时间尽可能多地更新。


我有一个 Django 应用程序,旨在从用户那里获取我们需要配置的产品的数据。产品分为主要产品的主要类别,然后按客户进一步拆分。主要产品具有默认设置,客户产品更改了其中一些设置,以及主要产品未列出的其他一些设置。每个客户也可能有产品的多种变体。

产品示例:

Main Product A
|
|-> Customer A Product A1
|-> Customer A Product A2
|
|-> Customer B Product A1
|-> Customer B Product A2

Main Product B
|
|-> Customer A Product B1
|-> Customer A Product B2
|
|-> Customer B Product B1
|-> Customer B Product B2

我需要/想要的是一张表格,供员工输入给定客户所需的设置,而无需应用程序事先知道需要多少设置以及有多少客户产品。

例子:

环境 产品A1 +
低电量 真的
延迟开始 5秒
+

如果用户然后点击加号(只是一个示例方法,也可以在此处打开建议),则会出现另一列,他们可以在其中输入产品名称(例如“产品 A2”)并开始根据相同的设置值:

环境 产品A1 产品 A2 +
低电量 真的 错误的
延迟开始 5秒 5秒
+

然后当准备好并保存表单时,表单将像两个单独的表单一样提交,其中“设置”在两个表单中都重复,并且产品特定列是分开的,如下所示:

Product:
Product A1

Settings:
Low Power = TRUE
Delayed Start = 5 seconds
Product:
Product A2

Settings:
Low Power = FALSE
Delayed Start = 5 seconds

首先,以上可能吗?从逻辑上讲,我可以看到这是可能的,但我对框架太陌生了,不知道从哪里开始寻找解决方案。

其次,如果不能如上所述,我可以在此页面之前获取产品,然后在此页面上拥有已知数量的列,但它仍然需要以相同的方式工作,即它们在提交时共享第一列,而且我仍然不知道行数。如果这降低了复杂性,那么这绝对是一个选择。

另外,我知道这可能被解读为“为我做我的项目”,这与事实相去甚远。我想了解如何做到这一点,而不仅仅是让它工作并忘记它。我也需要能够支持这个应用程序。因此,如果您甚至能够帮助我了解我需要注意什么才能朝着正确的方向前进,我仍然会非常感激!


先感谢您。

标签: djangodjango-forms

解决方案


我想你想要的是一个Formset

这些显示的默认方式是您的插图的转置:单击“添加”按钮在底部创建另一个表单实例。

如果您想使用表单集视图来实现“添加一组 X 类型的实体”,您可以动态构建表单,其中 X 由用户先前选择,并且其相关字段在运行时确定。

我见过的另一种方法(但没有写出来!)是使用前端框架构建数据网格并将其作为 JSON 发布。Django 可以使用具有单个 JSONField 的表单将此 JSON 解码为 Python 数据,然后处理该数据。请注意,如果您这样做,则必须对其进行验证以使您满意。您不能相信来自执行 POST 的可能敌对演员的任何东西。Django 表单提供了一个很好的验证框架,即使你从不显示它们。只需用未经验证的数据字典实例化它们并检查form.is_valid()

我在这里坚持一般性。希望这会给你一些指导。


推荐阅读