如何为不同的标签创建相同的下拉菜单?

时间:2017-10-20 03:19:07

标签: python csv flask jinja2

我正在Flask中构建一个应用程序,它从不同的CSV文件中获取数据。我有不同的标签(CSV文件中的列名),对于每个标签,我都有相同的下拉菜单。例如 -

  1. 运输方式
    • 多项选择
    • 单一选择
    • 时空
  2. 时间戳
    • 多项选择
    • 单一选择
    • 时空
  3. 首先,我尝试创建此模板。这是我的代码 -

    <div class="container">
    <form class="col s12" action="/config" method="POST" enctype="multipart/form-data">
        <div class="row">
            <h2>Assign Fieldnames</h2>
                {% for x in title %}
                  <label> {{ x }} :</label>
                  <select name="choice">
                         <option value="">Select One</option>
                         <option value="time">Temporal</option>
                         <option value="single">Single Choice</option>
                         <option value="multiple">Multiple Choice</option>
                  </select>
                {% endfor %}
            <input type="hidden" name="filename" value= {{filename}}></input>
              <button class="btn" type="submit" value="Update">Submit</button>
           </div>
       </form>
    </div>
    

    查看

    def config():
        filepath = request.form['filename']
        choice_to_make = ['Select one', 'Temporal', 'Single-Choice''Multi-
    Choice']
        print(filepath)
        with open(filepath,'r') as csvfile:
            reader = csv.reader(csvfile)
            title = next(reader)
            print(title)
        return render_template('pages/placeholder.configure1.html',
                               title=title,choice_to_make= choice_to_make, 
    filename=filepath)
    

    其次,我无法弄清楚如何为每个标签保存这些选择(多选,单选和临时),这样我就可以在将此CSV发送到Mongodb后根据这些选择查询数据。< / p>

2 个答案:

答案 0 :(得分:1)

第一步是将每个标签选择选项与唯一的特定名称相匹配,以便能够在以下视图中将它们关联起来。

<强>模板

您可以使用循环索引来执行此操作。

{% for name in title %}
  <label> {{ name }} :</label>
  <select name="choice-{{ loop.index }}">
         <option disabled selected value> Select One</option>
         <option value="time">Temporal</option>
         <option value="single">Single Choice</option>
         <option value="multiple">Multiple Choice</option>
  </select><br>
{% endfor %}

查看

下一步,在视图中,您可以将表单给出的选项存储在字典或元组列表中(请参阅第二个建议)。重要的是采用一种允许在标题和选择之间保持轻松匹配的结构。

如果您想要接下来调用特定标题,字典会更有趣:

@app.route("/config", methods=['POST'])
def config():

    choices = {}
    with open(request.form['filename'], 'r') as csvfile :
        reader = csv.reader(csvfile)
        titles = next(reader)
        for index, title in enumerate(titles,1):
            choice = 'choice-' + str(index)
            choices[title] = request.form.get(choice)

    #choices = {'Mode of Transport': 'time', 'Timestamp':'multiple' }

列表可能更好地连续处理所有标题并保留订单:

    choices = []
    with open(request.form['filename'], 'r') as csvfile :
        reader = csv.reader(csvfile)
        titles = next(reader)
        for index, title in enumerate(titles,1):
            choice = 'choice-' + str(index)
            choices.append((title, request.form.get(choice))

    #choices = [('Mode of Transport','time'), ('Timestamp','multiple')]

答案 1 :(得分:0)

每个标签只能保存一个选项。您将在POST请求中收到的那个。这些值将在MultiDict类型的request.form中提供,并且它们是唯一的有效值,您应该存储在数据库中。您可以通过request.form对象访问它们。

在您的HTML表单中,您似乎只会在request.form - &#39;选择&#39;中收到另一个项目,它将有两个值。因此,您必须解决如何区分它们中的哪两个值应与“运输方式”相关联。和&#39;时间戳&#39;。我怀疑它们的显示顺序与表单上的顺序相同,因此我希望在name标记的select属性中提供不同的名称。

不幸的是,您没有说明title是什么,所以看起来您应该使用任一循环来浏览request.form对象并将变量与接收到的值相关联,或者对它们进行硬编码以某种方式。