Flask и WTForms: как создать форму с несколькими кнопками отправки?

Представьте, что мне нужно создать такую ​​форму планирования путешествия:

Going from [_Picadily_Circus____]
Going to [_Marylebone_____]
(Starting by) (Arriving by) [5]:[30][pm]

Оба (Начало) (Прибытие) являются кнопками отправки. Этот пример является искусственным, чтобы показать вариант использования с двумя кнопками, поэтому не будем обсуждать удобство использования.

Как мне сделать это с помощью Flask и WTForms?

Как узнать, какая кнопка была нажата?


person Digital    schedule 18.03.2016    source источник


Ответы (1)


Значение данных кнопки отправки вашей формы будет True, если она была нажата. См. Ниже очень простой пример формы с двумя кнопками отправки и одним полем ввода.

from flask import Flask, render_template, flash
from flask.ext.wtf import Form
from wtforms import StringField, SubmitField
from wtforms.validators import DataRequired

app = Flask(__name__)
app.config['DEBUG'] = True
app.config['SECRET_KEY'] = 'well-secret-password'


class MyForm(Form):
    name = StringField(label='Name', validators=[DataRequired()])
    starting = SubmitField(label='Starting')
    ending = SubmitField(label='Ending')


@app.route('/', methods=['GET', 'POST'])
def index():
    form = MyForm()

    if form.validate_on_submit():
        print "Starting data Value : {value}".format(value=form.starting.data)
        print "Ending data Value : {value}".format(value=form.ending.data)
        flash(
            "You submitted name {name} via button {button}".format(
                name=form.name.data,
                button="Starting" if form.starting.data else "Ending"
            )
        )

        return render_template('index.html', form=form)

    if form.errors:
        for error_field, error_message in form.errors.iteritems():
            flash("Field : {field}; error : {error}".format(field=error_field, error=error_message))

    return render_template('index.html', form=form)


if __name__ == '__main__':
    app.run(debug=True)

Вот файл шаблона index.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

    {% with messages = get_flashed_messages() %}
      {% if messages %}
        <ul class=flashes>
        {% for message in messages %}
          <li>{{ message }}</li>
        {% endfor %}
        </ul>
      {% endif %}
    {% endwith %}

    <form method="POST" action="{{ url_for('index') }}">
        {{ form.csrf_token }}

        {{ form.name.label }} {{ form.name(size=20) }}
        <br><br>
        {{ form.starting }}
        {{ form.ending }}

    </form>
</body>
</html>
person pjcunningham    schedule 19.03.2016