【问题标题】:Django - how to get list of inputs, selects dynamically created with javascript?Django - 如何获取输入列表,选择使用 javascript 动态创建的?
【发布时间】:2018-02-09 00:15:23
【问题描述】:

我有一个 javascript 代码来创建基于动态添加的特征的所有产品组合。 该脚本的 HTML 结果是:

<form id="myWizard" action="" method="post" role="form">    
<table>
        <tbody>
          <tr>
            <td>1</td>
            <td><select id="combination[0].product" name="combination[0].product">
              <option value="25">
                product_desc pc.10
              </option>
              <option value="26">
                product_desc pc.5
              </option>
              <option value="21">
                product_desc
              </option>
            </select></td>
            <td><input readonly="readonly" value="5.00" id="combination[0].price" name="combination[0].price" class="form-control" type="text" /></td>
            <td><input readonly="readonly" value="a" id="combination[0].color" name="combination[0].color" class="form-control" type="text" /></td>
            <td><input readonly="readonly" value="1" id="combination[0].quantity" name="combination[0].quantity" class="form-control" type="text" /></td>
          </tr>

          <tr>
            <td>2</td>
            <td><select id="combination[1].product" name="combination[1].product">
              <option value="25">
                product_desc pc.10
              </option>
              <option value="26">
                product_desc pc.5
              </option>
              <option value="21">
                product_desc
              </option>
            </select></td>
            <td><input readonly="readonly" value="5.00" id="combination[1].price" name="combination[1].price" class="form-control" type="text" /></td>
            <td><input readonly="readonly" value="a" id="combination[1].color" name="combination[1].color" class="form-control" type="text" /></td>
            <td><input readonly="readonly" value="5" id="combination[1].quantity" name="combination[1].quantity" class="form-control" type="text" /></td>
          </tr>

          <tr>
            <td>5</td>
            <td><select id="combination[8].product" name="combination[8].product">
              <option value="25">
                product_desc pc.10
              </option>
              <option value="26">
                product_desc pc.5
              </option>
              <option value="21">
                product_desc
              </option>
            </select></td>
            <td><input readonly="readonly" value="5.00" id="combination[8].price" name="combination[8].price" class="form-control" type="text" /></td>
            <td><input readonly="readonly" value="c" id="combination[8].color" name="combination[8].color" class="form-control" type="text" /></td>
            <td><input readonly="readonly" value="50" id="combination[8].quantity" name="combination[8].quantity" class="form-control" type="text" /></td>
          </tr>
        </tbody>
      </table> 
</form>

当然可以有更多的特征(例如类型、材料...)。

如何使用 request.POST 处理它?我尝试了 getlist 但没有成功。 作为记录,我使用 Django 1.9。 有什么办法可以从这个请求中获取字典列表,所以我会得到类似的东西:

list = [{'product_id': '25', 'price':'5.00', 'color':'c', 'quantity':'50'},
{'product_id': '26', 'price':'5.00', 'color':'a', 'quantity':'1'},
{'product_id': '21', 'price':'5.00', 'color':'a', 'quantity':'5'} 
]

还是类似的?

【问题讨论】:

  • 我们可以假设表格被&lt;form method="POST"&gt; 元素包围吗?
  • 是的。它在&lt;form&gt;elalement 里面。我更新了问题。
  • 表中没有像 12.22 或 2.22 这样的价格(它们都是 5.00),也没有像黑色或蓝色这样的颜色('a' 或 'c')。请确保您的示例输入对应于您想要的示例输出。

标签: python django python-3.x django-views


【解决方案1】:

一种解决方案是直接操作 POST 数据,例如:

results = defaultdict(dict)
for k, v in request.POST.items():
    _, no, key = re.split(r'\[(?P<no>\d+)\]\.', k, maxsplit=2)
    results[no][key] = v
data = []
for value in results.values():
    data.append(value)

生成的data 看起来像(使用当前表数据):

[{'product': '25', 'price': '5.00', 'color': 'a', 'quantity': '1'}, 
 {'product': '25', 'price': '5.00', 'color': 'a', 'quantity': '5'}, 
 {'product': '25', 'price': '5.00', 'color': 'c', 'quantity': '50'}]

这不会处理不遵循“组合[].name”约定的 POSTed 字段;您必须自己清除它们(例如,如果正则表达式失败,则将上面的代码包装在异常中,或者使用简单的 if 语句)。
也没有数字到浮点数或整数的转换,因为 Django 无法知道输入类型是什么,因此假设一切都是字符串。


您可能需要重新考虑您的表单生成,尤其是如果您想使用 Django。使用 Django 表单(甚至模型表单)会自动为您提供正确的输出格式,并提供正确的转换和类型检查。

看看Django's formsets,它正是用于生成多个表单,并且似乎非常接近您的示例表单。

(注意:截至目前,1.9 版文档上方有一个红色条,表示它是不安全且不受支持的 Django 版本。看看您是否可以升级到 2.0。)

【讨论】:

    猜你喜欢
    • 2022-07-06
    • 1970-01-01
    • 2020-01-24
    • 1970-01-01
    • 1970-01-01
    • 2012-10-31
    • 1970-01-01
    • 2013-04-06
    • 2019-02-06
    相关资源
    最近更新 更多