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>
Toujours jeter la même erreur après le changement à 'choix = pChoices' –
Voir la réponse éditée :) –
toujours pas de chance, voir ma question éditée –