我有一个使用WTForms处理用户输入的Flask应用程序,其中包含一个SelectMultipleField
的表单。但是,无论用户选择了多少项目,我似乎都无法让应用程序将该字段中的所有项POST出去;它只会发送第一个选择的项。
Flask文档对这个字段类型发送的数据有如下解释,但我没有看到这种行为:
SelectMultipleField中的数据作为对象列表存储,每个对象都会从表单输入中进行检查和强制转换。
以下是一个完整而简洁的Flask应用程序,可以说明这一点:
#!/usr/bin/env python
from flask import Flask, render_template_string, request
from wtforms import Form, SelectMultipleField
application = app = Flask('wsgi')
class LanguageForm(Form):
language = SelectMultipleField(u'Programming Language', choices=[('cpp', 'C++'), ('py', 'Python'), ('text', 'Plain Text')])
template_form = """
{% block content %}
<h1>Set Language</h1>
<form method="POST" action="/">
<div>{{ form.language.label }} {{ form.language(rows=3, multiple=True) }}</div>
<button type="submit" class="btn">Submit</button>
</form>
{% endblock %}
"""
completed_template = """
{% block content %}
<h1>Language Selected</h1>
<div>{{ language }}</div>
{% endblock %}
"""
@app.route('/', methods=['GET', 'POST'])
def index():
form = LanguageForm(request.form)
if request.method == 'POST' and form.validate():
print "POST request and form is valid"
language = request.form['language']
print "languages in wsgi.py: %s" % request.form['language']
return render_template_string(completed_template, language=language)
else:
return render_template_string(template_form, form=form)
if __name__ == '__main__':
app.run(debug=True)