2017-09-04 3 views
0

J'utilise Flask et WTForm pour faire une application web, jusqu'ici mes deux autres champs valident bien, mais le SelectField lance l'erreur 'S'il vous plaît choisir un animal de compagnie.' comme indiqué par moi-même, il pense qu'il ne reçoit pas une entrée valide. Les SelectField.choices correspondent aux options rendues en HTML, alors qu'est-ce que je fais de mal?Flask La validation de WTForm échoue pour SelectField ... pourquoi?

app.py

from flask_wtf import Form 
from flask_wtf.csrf import CSRFProtect 
from wtforms import IntegerField, StringField, SelectField, validators, 
ValidationError 
from flask import Flask, request, flash, render_template 

app = Flask(__name__) 
app.secret_key = 'xxxxxxxxxxxx' 
csrf = CSRFProtect(app) 


pChoices = [('-1', '-----'), 
      ('0', 'Cat'), 
      ('1', 'Dog'), 
      ('2', 'Parrot'), 
      ('3', 'Hamster')] 


class paymentForm(Form): 
    productF = SelectField('productF', [validators.input_required("Please choose a pet.")], choices=[pChoices], coerce=int) 
    buyer_id = StringField('buyer', [validators.input_required("Please enter your name.")]) 
    paid = DecimalField('paid', [validators.input_required("please enter payment amount")]) 


@app.route('/', methods=['POST', 'GET']) 
def index(): 
    form = paymentForm(request.form, csrf_enabled=True) 
    if form.validate_on_submit(): 
     flash('Order Placed Successfully', 'success') 
     data = form.data 
     record_order(data) 
     print(data['price']) 
     return render_template('confirmation.jinja', 
           pets=PETS, 
           title='Confirmation Page', 
           form=form, error=form.errors, 
           ** context) 
    elif not form.validate_on_submit: 
     flash('Submission error, please check the form', 'success') 
    return render_template('index.jinja', 
           title='Order Form', 
           form=form, 
           error=form.errors, 
           **context) 

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

index.jinja

{% extends 'base.jinja' %} 

{% block main %} 
    <form method="post"> 
    <div class="form-group row"> 
     <label for="product" class="col-sm-2 form-control-label">Pet:</label> 
     <div class="col-sm-8"> 
     <select id="productF" class="form-control" name="pet" onchange="Update()"> 
      <option value="-1">-----</option> 
      {% for pet in pets %} 
      <option value="{{ loop.index -1 }}">{{ pet.name }}</option> 
      {% endfor %} 
     </select> 
     </div> 
    </div> 
    <div class="form-group row"> 
     <label for="buyer" class="col-sm-2 form-control-label">Buyer:</label> 
     {% for message in form.buyer_id.errors %} 
     <div>{{ message }}</div> 
     {% endfor %} 
     <div class="col-sm-10"> 
     <input type="text" class="form-control" id="buyer_id" name="buyer_id" placeholder="Buyer" value="{{ buyer_id }}" required> 
     </div> 
    </div> 
    <div class="form-group row"> 
     <label for="paid" class="col-sm-2 form-control-label">Amount Paid:</label> 
     {% for message in form.paid.errors %} 
     <div>{{ message }}</div> 
     {% endfor %} 
     <div class="col-sm-10"> 
     <input type="text" class="form-control" id="paid" name="paid" placeholder="Amount Paid" value="{{ paid }}" required> 
     </div> 
    </div> 
    {% if form.errors %} 
    {{ form.errors }} 
    {% endif %} 
    <div class="form-group row"> 
     <div class="col-sm-offset-2 col-sm-10"> 
     <button type="submit" class="btn btn-primary">Place Order</button> 
     </div> 
    </div> 
     <input type="hidden" name="csrf_token" value="{{ csrf_token() 
}}"/> 
    </form> 


{% endblock %} 

modifier J'ai mis à jour le code avec productF comme le nom du champ dans le fichier Jinja et je reçois encore l'erreur. L'objet Pets est chargé dans la page HTML en tant qu'objet JSON au lieu d'app.py mais pour autant que je puisse dire que les valeurs sont identiques; c'est ainsi l'élément de sélection apparaît à l'inspecteur:

<select id="product" class="form-control" name="product"> 
      <option value="-1">-----</option>   
      <option value="0">Cat</option>   
      <option value="1">Dog</option>   
      <option value="2">Parrot</option>   
      <option value="3">Hamster</option>   
     </select> 

Répondre

0

vous définissez pChoices comme une liste

pChoices = [('-1', '-----'), 
      ('0', 'Cat'), 
      ('1', 'Dog'), 
      ('2', 'Parrot'), 
      ('3', 'Hamster')] 

Mais l'enveloppant dans une autre liste dans la définition SelectField:

productF = SelectField(..., choices=[pChoices], ...) 

En utilisant choices=pChoices devrait le réparer.

Edit: vous avez également pet comme le nom du champ dans le modèle de formulaire de Jinja, vous voulez probablement utiliser productF.

Édition 2: Il y a une différence dans la façon dont vous définissez les valeurs pour pChoices et la contrainte de champ. Supprimez coerce=int du champ de formulaire ou définissez la première valeur des tuples dans pChoices pour être des entiers, pas des chaînes.

+0

Toujours jeter la même erreur après le changement à 'choix = pChoices' –

+0

Voir la réponse éditée :) –

+0

toujours pas de chance, voir ma question éditée –