我正在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>
查看
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>
答案 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
对象并将变量与接收到的值相关联,或者对它们进行硬编码以某种方式。