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

Python 如何为不同的标签创建相同的下拉菜单?,python,csv,flask,jinja2,Python,Csv,Flask,Jinja2,我正在Flask中构建一个应用程序,它从不同的CSV文件中获取数据。我有不同的标签(CSV文件中的列名),每个标签都有相同的下拉菜单。比如说- 运输方式 选择题 单选 暂时的 时间戳 选择题 单选 暂时的 首先,我尝试创建这个模板。这是我的密码- <div class="container"> <form class="col s12" action="/config" method="POST" enctype="multipart/form-data">

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

  • 运输方式
    • 选择题
    • 单选
    • 暂时的
  • 时间戳
    • 选择题
    • 单选
    • 暂时的
  • 首先,我尝试创建这个模板。这是我的密码-

    <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>
    

    其次,我无法确定如何为每个标签保存这些选项(多选、单选和时态),以便在将此CSV发送到Mongodb后可以根据这些选项查询数据。

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

    从HTML表单中,您似乎只会收到
    请求.form
    -“choice”中的另一项,并且它将有两个值。因此,您必须解决如何区分这两个值中与“传输模式”和“时间戳”相关联的值。我怀疑它们是否会以与表单相同的顺序出现,因此我更愿意在
    select
    标记的
    name
    属性中提供不同的名称


    不幸的是,您没有指明什么是
    标题,因此看起来您应该使用任何一个循环来遍历
    请求。形成
    对象并将变量与接收到的值关联,或者以某种方式对它们进行硬编码。

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

    模板

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

    {% 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 %}
    

    列表最好能处理一行中的所有标题并保持顺序:

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

    你能把
    /config
    路由的代码包括进来吗?@LuisOrduz我已经更新了编码。你能解释我这一行
    的索引,枚举中的标题(标题,1):
    枚举
    返回一个带有索引和相关值的元组,通过在参数中添加
    1
    ,它使索引从1开始,而不是从0开始。然后
    对于索引,title
    是解压返回元组并将名称与值关联的语法。这似乎不起作用。是否有任何方法可以通过使用字段数进行循环?我可以获得标签名称,但下拉列表不起作用。您能告诉我哪里出错了吗?这种方法基于csv文件头给定的字段,应该与填充html模板时使用的方法相同。也许我错过了什么?什么不适用于下拉菜单?
    @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')]