2012-11-26 23 views
7

私はユーザー入力にWTFormsを使用するFlaskアプリケーションを持っています。これはフォーム内でSelectMultipleFieldを使用します。私は選択されたときに、フィールド内のすべてのアイテムをPOSTするようにアプリを取得することはできません。ユーザーが選択した数に関係なく、選択された最初の項目のみが送信されます。Flask App SelectMultipleFieldでWTFormsを使用する

Flask documentationが、これは、このフィールドタイプから送信されたデータについて述べているが、私は、この動作が表示されない:

SelectMultipleField上のデータがある それぞれの、オブジェクトのリストとして保存されていますフォームの入力からチェックされ、強制されます。

はここでこれを示し、完全な、最小限のフラスコアプリです:

#!/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) 

答えて

9

フラスコをWERKZEUG MultiDictオブジェクトとしてのRequest.Formを返します。これは辞書のようなものであり、不注意な人のための罠でしかありません。

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オブジェクトを処理し、フォームデータをバインドしているので、リストを返すだけです。

+0

それでした!どうもありがとう! – Raj

関連する問題