2017-06-02 9 views
0

私は、Flask(0.12)、WtForms(2.1)、SQLAlchemy(1.1.5)で非常にシンプルなフォームを作成しようとしています。なぜ私のSelectFieldとRadioFieldは決して検証されませんか?

form.py:

from flask_wtf import Form 
from wtforms import StringField, BooleanField, RadioField, SelectField, IntegerField, SubmitField 
from wtforms.validators import DataRequired 
from app.models.theme import Theme 
from app.models.type import Type 
from app.models.user import User 

class CreateFolderForm(Form): 
    responsible = SelectField('Responsible', choices=User.form_list()) 
    anomaly_type = SelectField('Anomaly type', choices=Type.form_list()) 
    theme = SelectField('Theme', choices=Theme.form_list()) 
    corrective_needed = BooleanField('Corrective action needed') 
    cost = IntegerField('Cost') 
    risk_level = RadioField('risk level', choices=[(1, '1'), (2, '2'), (3, '3'), ]) 
    risk_occurrence = RadioField('risk occurrence', choices=[(1, '1'), (2, '2'), (3, '3'), ]) 
    submit = SubmitField('Create') 

template.html:

{% block content %} 
    <h1>New Folder</h1> 
    <div class="form-group"> 
     <form action="" method="post" name="new folder"> 
      {{ form.csrf_token }} 
      Responsible : {{ form.responsible }} <br/> 
      Anomaly Type : {{ form.anomaly_type }} <br/> 
      Theme : {{ form.theme }} <br/> 
      Corrective Action needed : {{ form.corrective_needed }} <br/> 
      Cost : {{ form.cost }}<br/> 
      Risk Level : {{ form.risk_level }}<br/> 
      Occurrence Level : {{ form.risk_occurrence }}<br/> 
      {{ form.submit }} 
     </form> 
    </div> 
{% endblock %} 

controller.py:

from datetime import datetime 
from flask import redirect, url_for, flash 
from app import app 
from flask import render_template 
from app import db 
from app.models.qualityFolder import QualityFolder 
from app.models.user import User 
from app.forms.create_folder_form import CreateFolderForm 

@app.route('/folder/add', methods=['GET', 'POST']) 
def add_folder(): 
    form = CreateFolderForm() 
    print(form.responsible.validate(form)) 
    print(form.responsible.errors) 
    if form.validate_on_submit(): 
     print(form) 
     folder = QualityFolder() 
     folder.anomaly_type_id = int(form.anomaly_type.data) 
     folder.corrective_action_wanted = form.corrective_needed.data 
     folder.cost = int(form.cost.data) 
     folder.creation_date = datetime.now() 
     if form.credit.data: 
      folder.credit = int(form.credit.data) 
     folder.risk_level = int(form.risk_level.data) 
     folder.occurrence_level = int(form.risk_occurrence) 
     db.session.add(folder) 
     db.session.commit() 
     return redirect(url_for('index')) 
    return render_template('create/folder_form.html', title='New Folder', form=form) 

form.responsible.validate(form)は私にFalseを返しますが、私は空のリストを返しますprint(form.responsible.errors)。私は、「異常タイプ」、「テーマ」、「リスクレベル」、「リスク発生」についても同じ問題を抱えています。

NB:form_list方法は以下のように全てのとおりです。

@staticmethod 
def form_list(): 
    themes = Theme.query.all() 
    themes_list = [] 
    for theme in themes: 
     themes_list.append([theme.id, theme.label]) 
    return themes_list 

はなぜ私のフォーム「validate_on_submit」ではない、と私のフィールドは「偽」私を返すのですか? WTForms docsから

答えて

0

:あなたは がダイナミックドロップダウンリストを作りたい場合は、あなたがフィールドに選択肢に リストを割り当てるしたいと思うので、選択肢のキーワードのみ、一度だけ評価されていることを

注意インスタンス化後


ドキュメントのページの例をもとに、あなたはこのような何かをする必要があります:

class CreateFolderForm(Form): 
    responsible = SelectField('Responsible', coerce=int) 

@app.route('/folder/add', methods=['GET', 'POST']) 
def add_folder(): 
    form = CreateFolderForm() 
    form.responsible.choices = User.form_list() 
    ... 
    if form.validate_on_submit(): 
     ... 


もう一つ - choicesはあなたながらtupleを期待します現在、listを提供しています。更新form_list

@staticmethod 
def form_list(): 
    return [ 
     (theme.id, theme.label) for theme in Theme.query.all() 
    ] 
+0

ありがとう、実際にはcoerce = intは仕事をしました。なぜドキュメントが必要なのかを調べるためにドキュメントを用意します。 –

関連する問題