【问题标题】:Parse html form into a list of dicts in python / Flask将 html 表单解析为 python / Flask 中的字典列表
【发布时间】:2022-01-17 06:04:25
【问题描述】:

我是网络编程新手,这是我的第一个 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'}]

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

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

【问题讨论】:

    标签: python html forms flask


    【解决方案1】:

    这个呢?

    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]})
    

    【讨论】:

      【解决方案2】:

      也许是 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

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

      【讨论】:

      • 我已经对此进行了测试,但它不起作用。 '如果是这样就好了。
      【解决方案3】:

      这对我有用。

      在我的 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 }, ... ]
      

      【讨论】:

        猜你喜欢
        • 2018-02-11
        • 2021-12-30
        • 1970-01-01
        • 1970-01-01
        • 2021-04-10
        • 1970-01-01
        • 1970-01-01
        • 2011-09-13
        • 1970-01-01
        相关资源
        最近更新 更多