2017-09-04 10 views
0

私はFlaskとWTFormを使ってWebアプリケーションを作っていますが、これまでのところ、他の2つのフィールドは正しく検証されていますが、SelectFieldは「ペットを選んでください」というエラーを投げています。つまり自分が正当な入力を受け取っていないと思っていると思っています。 SelectField.choicesはHTMLにレンダリングされるオプションと一致しますので、何が間違っていますか?SelectFieldのFlask WTFormの検証に失敗しました...なぜですか?

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 %} 

編集私は神社ファイル内のフィールド名としてproductFでコードを更新していると私はまだ受け取りますエラー。 Petsオブジェクトは、app.pyの代わりにJSONオブジェクトとしてHTMLページに読み込まれますが、値が同じであるとわかる限り、HTMLページにロードされます。これは、select要素は、インスペクタから見える方法です:

<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> 

答えて

0

あなたがリスト

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

としてpChoicesを定義しかし、その後SelectField定義の中で別のリストでそれをラップしている:

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

choices=pChoicesを使用すると修正されるはずです。

編集:あなたもフォーム神社テンプレート内のフィールド名としてpetを持って、あなたはおそらくproductFを使用します。

編集2:pChoicesの値とフィールド強制の定義方法に不一致があります。フォームフィールドからcoerce=intを削除するか、pChoicesのタプルの最初の値を文字列ではなく整数に設定します。

+0

'choices = pChoices'に変更した後も同じエラーが返されます –

+0

編集済みの回答を参照してください。 –

+0

私の編集した質問 –

関連する問題