2016-03-18 4 views
1

Man stelle ich brauche eine Reiseplanung Form so bauen:Flask & WTForms: Wie erstellt man ein Formular mit mehreren Sendeschaltflächen?

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

Beide (Beginnend von) (Anfahrt) sind Tasten vor. Das Beispiel ist künstlich, um einen Zwei-Tasten-Anwendungsfall zu zeigen, also diskutieren wir die Usability nicht.

Wie mache ich das mit Flask und WTForms?

Wie sieht man, welche Taste tatsächlich gedrückt wurde?

Antwort

7

Der Datenwert des Formulars zum Senden des Formulars lautet True, wenn es gedrückt wurde. Siehe sehr einfaches Beispiel unten eines Formulars mit zwei Senden-Schaltflächen und einem einzelnen Eingabefeld.

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) 

Hier ist die Template-Datei 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>