2017-06-02 59 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)返回我一个空列表。我对“异常类型”,“主题”,“风险级别”和“风险发生”也有同样的问题。

注:该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”,并做我的领域还给我“假”?

回答

0

WTForms docs

注意,选择关键字只计算一次,所以如果你想 做一个动态下拉列表,你会想 列表分配的选择到外地实例化后。


基于文档页面例子,你必须做这样的事情:

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做的工作。我会投资这些文档来找出为什么需要它。 –

相关问题