我想从HTML表单中获取输入,并以JSON格式给出输出。当选择多个值时,它们不会转换为JSON数组,只使用第一个值。
@app.route('/form')
def show_form():
return render_template('form.html')
@app.route("/result", methods=['POST'])
def show_result():
result = request.form
return render_template('result.html', result=result)
form.html
:
<form method=POST>
<input name=server>
<select name=owners multiple>
<option value="thor">thor</option>
<option value="loki">loki</option>
<option value="flash">flash</option>
<option value="batman">batman</option>
</select>
<input type=submit>
</form>
result.html
:
{{ result|tojson }}
当为owner选择了多个值"thor"和"flash"时,输出只显示一个值:
{"server": "app-srv", "owners": "thor"}
我期望业主们会列出一份名单:
{"server": "app-srv", "owners": ["thor", "flash"]}
如何将表单显示为JSON而不丢失列表值?
2条答案
按热度按时间0md85ypi1#
request.form
是一个MultiDict
。迭代多字典只返回每个键的第一个值。若要获取包含值列表的字典,请使用to_dict(flat=False)
。为了一致性,所有的值都将是列表,即使只有一个项。如果您希望扁平化单值项,则需要手动处理数据。请使用带有dict解析的
iterlists
。dnph8jn42#
使用“flat”参数时的结果差异:
result = request.form.to_dict(flat=True)
结果:
{'a': '6', 'b': '7', 'c': '8'}
result = request.form.to_dict(flat=False)
结果:
{'a': ['6'], 'b': ['7'], 'c': ['8']}