2

我是网络编程的新手,这是我的第一个 SO 问题,所以希望我问的是正确的方法。我正在构建一个简单的调查制作工具(类似于谷歌表格或调查猴子),并且我有一个允许用户向问题添加选项的网络表格。每个选项都有两个字段,“标签”和“值”。表格如下所示:

    Option One
           ------------------           ------------------
    Label: |                |   Value:  |                |
           ------------------           ------------------

    Option Two
           ------------------           ------------------
    Label: |                |   Value:  |                |
           ------------------           ------------------
    ...
    ...
    ... // user can "add option" and additional "rows" will appear in the form

[ SUBMIT ]

我使用了这样的基本网络表单:

<form class="well form" action="/submitform" method="post">
  <p><input type="text" name="label_1">
     <input type="text" name="value_1"></p>
  <p><input type="text" name="label_2">
     <input type="text" name="value_2"></br></p>
  <p>...   // and so forth, to support n sets of two fields
     ...
     ...
  <button type="submit">Submit</button>
</form>

我成功获得 request.form 并且可以访问字典中的每个变量。但当然它是一个单一的平面字典:

[{'label_1': 'labelone', 'value1': 'valueone', 'label_2': 'label two'}]

等等。我想要一个这样的字典列表:

[ {'label': 'labelone', 'value': 'valueone'}, {'label': 'labeltwo', 'value': 'valuetwo'}]

我已经想到了几种骇人听闻的方法来做到这一点,但都需要预先了解表单选项的数量和类型。我宁愿找到更灵活的解决方案。

这里有什么最佳实践吗?很多网站都做这样的事情,所以我猜我缺少一个最佳实践。

4

3 回答 3

0

也许是 html 数组?(我不知道它们的正式名称是什么)结合getlist

<p><input type="text" name="user_label[0]">
     <input type="text" name="user_value[0]"></p>
  <p><input type="text" name="user_label[1]">
     <input type="text" name="user_value[1]"></br></p>

我在想这可以做类似的事情

request.form.getlist('user_label')
request.form.getlist('user_value')

你可以把它们拉在一起,形成一对lables: values

我还没有用烧瓶测试过这个

于 2012-12-29T19:09:54.717 回答
0

那这个呢?

l = [{'label_1': 'labelone', 'value_1': 'valueone', 'label_2': 'label two', 'value_2':'v2'}]

values = int(len(l[0])/2)
dicts = []
for i in range(values):
    label_name = 'label_%s' % (i+1)
    value_name = 'value_%s' % (i+1)
    dicts.append({'label':l[0][label_name], 'value':l[0][value_name]})
于 2012-12-29T19:19:37.953 回答
0

这对我有用。

在我的 Jinja 模板中,我有以下标记

{% for object in objects %}
<div>
<input type="hidden" name="id" value="{{object.id}}">
<input type="text" name="name" value="{{object.name}}">
<input type="text" name="age" value="{{object.age}}">
</div>
{% endfor %}

然后在我的 Flask 应用程序中

@app.route("/update/", methods=["POST"])
def update_people():
    ids = request.form.getlist('id')
    names = request.form.getlist('name')
    ages = request.form.getlist('age')
    data = [{'id': ids[k], 'name': names[k], 'age': ages[k]} for k,v in enumerate(ids)]
    # [ {'id': 1, 'name': 'Bob', 'age': 25 }, ... ]
于 2022-01-16T22:04:25.520 回答