2017-06-04 1 views
0

Ich habe die DataRequired-Validierung in zwei wtform-Komponenten eingerichtet, die ein SelectField und ein StringField umfassen.Die Validierung von wtfform funktioniert nicht mehr, wenn die HTML-Formularaktion folgende Seite zurückgibt

Die vom Benutzer auf der Seite index eingegebenen Informationen sollen dann in die folgende results-Seite übernommen werden.

Die Validierung funktioniert, wenn das form action-Attribut in der Datei index.html auf "" gesetzt ist. Die eingegebenen Formulardaten werden jedoch nicht in einer Variablen gespeichert und werden in diesem Szenario an die results übertragen (das Tabellenfeld auf der Ergebnisseite zeigt "None" an).

Wenn jedoch das form action Attribut in index.html zu results gesetzt ist die inputed Felddaten werden gespeichert und auf der Ergebnisseite übertragen, aber DataRequired Validierung erfolgt nicht mehr, vermutlich weil die HTML-Attribut action umgeht die if form.validate_on_submit() im views.py Datei.

Hier sind die index.html, forms.py und views.py Dateien als Referenz. Wie kann ich einen Weg finden, wie die Validierung funktioniert UND die eingegebenen Daten auf die Ergebnisseite übertragen werden?

views.py Datei:

####Index Page 
@app.route('/', methods=['GET', 'POST']) 
@app.route('/index', methods=['GET', 'POST']) 
def index(): 
     exception = "" 
     try: 
      connectToDB() 
     except: 
      exception = 'Failure to connect to db' 
     form = StaffNames() 
     if not exception: 
       if form.validate_on_submit(): 
         return redirect('/results') 
     return render_template('index.html',title='Search Page',exception=exception,form=form) 

#####Results Page 
@app.route('/results', methods=['GET', 'POST']) 
def results(): 
     form =StaffNames() 
     return render_template('results.html', 
          title='Results', form=form, staff_name = dict(staff_choices).get(form.staff.data)) 

index.html:

<form action="" method="post" name="index"> 
     <p> {{ form.hidden_tag() }} </p> 
     <p>{{ form.ranumber }} Enter RA Number</p> 
     {% for error in form.ranumber.errors %} 
     <span style="color: red;">[{{ error }}]</span> 
      {% endfor %}<br> 
     <p>{{ form.staff }} Select your name</p> 
     {% for error in form.staff.errors %} 
     <span style="color: red;">[{{ error }}]</span> 
      {% endfor %}<br> 

     <p><input type="submit" value="Search"></p> 
    </form> 

forms.py:

from flask_wtf import Form 
from wtforms import StringField, SelectField 
from wtforms.validators import DataRequired 


staff_choices=[("", ""), ('1', 'John Jones'), ('2', 'Chris Hughes'), ('   3', 'Lyn Tony')] 
class StaffNames(Form): 
     ranumber = StringField('ranumber', validators=[DataRequired()]) 
     staff = SelectField('staff',choices=staff_choices,validators=[DataRequired()]) 

Antwort

1

Haben Sie versucht, die Formulardaten als Query-String zu übergeben?

####Index Page 
@app.route('/', methods=['GET', 'POST']) 
@app.route('/index', methods=['GET', 'POST']) 
def index(): 
     exception = "" 
     try: 
      connectToDB() 
     except: 
      exception = 'Failure to connect to db' 

     form = StaffNames() 
     if not exception: 
      if form.validate_on_submit(): 
       query = { 
        'staff': form.staff.data, 
        'ranumber': form.ranumber.data 
       } 
       return redirect(url_for('results', **query)) 

     return render_template(
      'index.html', title='Search Page', exception=exception, form=form 
     ) 


#####Results Page 
from flask import request 

@app.route('/results') 
def results(): 
    ranumber = request.args.get('ranumber', None) 
    staff = request.args.get('staff', None) 

    return render_template(
     'results.html', title='Results', staff=staff, ranumber=ranumber 
    ) 

diese Weise können Sie ganz Attribut Aktion des Formulars

<form method="post" name="index"> 
... 
</form> 
+0

Ok überspringen kann, das hat funktioniert thanks- können Sie die 'nur erklären ** query' Bit, was das' '** nicht tun? Prost – nmh

+0

@nmh ** Abfrage ist das gleiche wie ** kwargs - https://stackoverflow.com/questions/1769403/understanding-kwargs-in-python; Und hier ist, wie url_for es verwendet: http://flask.pooco.org/docs/0.12/api/#flask.url_for – dm295

Verwandte Themen