使用带有SelectMultipleField的WTForms的Flask应用程序

时间:2012-11-26 03:35:34

标签: python flask jinja2 wtforms

我有一个Flask应用程序,它使用WTForms进行用户输入。它在表单中使用SelectMultipleField。我似乎无法让应用程序在选中时在字段中发布所有项目;它只发送选择的第一个项目,无论用户选择了多少。

Flask documentation说明了此字段类型发送的数据,但我没有看到此行为:

  

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)

2 个答案:

答案 0 :(得分:9)

Flask将request.form作为werkzeug MultiDict对象返回。这有点像字典,只是为了警惕而陷阱。

http://flask.pocoo.org/docs/api/#flask.request http://werkzeug.pocoo.org/docs/datastructures/#werkzeug.datastructures.MultiDict

MultiDict实现所有标准字典方法。在内部,它将键的所有值保存为列表,但标准的dict访问方法只返回键的第一个值。如果您也想要访问其他值,则必须使用列表方法。

然而,我认为这是一种更简单的方法。 你可以帮我一个忙,试试替换:

language =  request.form['language']

language =  form.language.data

看看是否有什么不同? WTForms应该处理MultiDict对象,并且只是为您自己返回一个列表,因为您已经将表单数据绑定到它。

答案 1 :(得分:1)

我最近遇到了这个问题。我发现您可以检索使用

选择的所有项目
request.form.getlist('...')

这将得出一个包含所有选定项目的列表。在您的情况下,请使用:

languages = request.form.getlist('language')