使用Flask将表单中的输入行作为对象发布?

时间:2018-03-20 00:51:39

标签: python html flask

我有这个表单form,其中每一行代表一个填充了输入的对象。

以下是表单的片段:

<form>
<li>
    <select name="network[][layer_type]"><!-- options here --></select>
    <input type="number" name="network[][num_filters]">
    <!-- other parameters here -->
</li>
<li>
    <select name="network[][layer_type]"><!-- options here --></select>
    <input type="number" name="network[][pool_size]">
    <!-- other parameters here -->
</li>
<li>
    <select name="network[][layer_type]"><!-- options here --></select>
    <input type="number" name="network[][num_filters]">
    <!-- other parameters here -->
</li>
</form>

在提交时,我希望输出字典如下:

{
"network":[
    {"layer_type": "conv2d", "num_filters": 16, "kernel_size": 2, "padding": "valid", "stride": 2},
    {"layer_type": "max_pool2d", "num_filters": 16, "kernel_size": 2, "padding": "valid", "stride": 2},
    {"layer_type": "conv2d", "num_filters": 32, "kernel_size": 3, "padding": "valid", "stride": 2}       
  ]
}

使用request.form.getlist('network[]')返回[]。如何使用Flask获取输出dict?

1 个答案:

答案 0 :(得分:1)

对于烧瓶以及代码与模板之间的关系似乎存在根本性的误解。首先,您无法使用Jinja(Flask标准)或其他工具将代码删除到HTML模板中。使用Jinja,您可以使用{{variable}}将变量添加到HTML模板中,并使用{% for item in list %} HTML to loop {% endfor%}将有限的逻辑添加到模板中。有关Jinja惯例herehere的更多信息。

假设您希望用户使用您的选择和输入来设置图层类型和过滤器数量,并且其他详细信息设置为类似的fasshion,您将希望模板看起来像这样:

<form>
<li>
    <select name="net1_layer_type_1"><!-- options here --></select>
    <input type="number" name="net1_num_filters_1">
    <!-- other parameters here -->
</li>
<li>
    <select name="net1_layer_type_2"><!-- options here --></select>
    <input type="number" name="net1_num_filters_2">
    <!-- other parameters here -->
</li>
<li>
    <select name="net1_layer_type_3"><!-- options here --></select>
    <input type="number" name="net1_num_filters_3">
    <!-- other parameters here -->
</li>
</form>

然后在相应的烧瓶路线中,您可以像这样构建这个字典:

networks = {}
networks['network'] = []
networks['network'][0] = {'layer_type': request.form['net1_layer_type_1'], 'num_filters': request.form['net1_num_filters_1'], "kernel_size": 2, "padding": "valid", "stride": 2}

重复其他项目。

以此为基础,我确信您可以看到如何使其更具动态性,允许其他网络使用其他成员,并使用循环创建每个网络成员。让我们假设您想要创建4个网络,每个网络有5个成员,在呈现您的表单的路线上,您创建列表&#34; network_count&#34;和&#34; member_count&#34;它们分别看起来像[1,2,3,4]和[1,2,3,4,5]。然后在您的模板上使用循环来构建如下所示的表单:

<form>
    {% for net in network_count %}
        {% for mem in member_count %}
            <li>
                <select name="net{{net}}_layer_type_{{member}}"><!-- options here --></select>
                <input type="number" name="net{{net}}_num_filters_{{member}}">
                <!-- other parameters here -->
            </li>
        {% endfor %}
    {% endfor %}
</form>

使用与以前相同的python进行处理,但也循环。