Приложение Flask, использующее WTForms с SelectMultipleField


У меня есть приложение Flask, которое использует WTForms для ввода данных пользователем. Он использует SelectMultipleField в форме. Я не могу заставить приложение публиковать все элементы в поле при выборе; он отправляет только первый выбранный элемент независимо от того, сколько пользователь выбирает.

Документация колбы говорит Это о данных, отправленных из этого типа поля, но я не вижу такого поведения:

Данные поля 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)
1 6

1 ответ:

Фляжка возвращает запрос.форма как объект 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 и просто возвращать список для вас, так как вы привязали к нему данные формы.