为什么我的 SelectField 和 RadioField 从不验证?
Why are my SelectField and RadioField never validate?
我正在尝试使用 Flask (0.12)、WtForms (2.1) 和 SQLAlchemy (1.1.5) 构建一个非常简单的表单。
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)
return 给我 False
,但是 print(form.responsible.errors)
return 给我一个空列表。 "anomaly type"、"theme"、"risk level" 和 "risk occurrence".
也有同样的问题
注意: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" 和我的字段 return 我 "False" 不一样?
来自WTForms docs:
Note that the choices keyword is only evaluated once, so if you want
to make a dynamic drop-down list, you’ll want to assign the choices
list to the field after instantiation.
根据文档页面示例,您必须执行以下操作:
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()
]
我正在尝试使用 Flask (0.12)、WtForms (2.1) 和 SQLAlchemy (1.1.5) 构建一个非常简单的表单。
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)
return 给我 False
,但是 print(form.responsible.errors)
return 给我一个空列表。 "anomaly type"、"theme"、"risk level" 和 "risk occurrence".
注意: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" 和我的字段 return 我 "False" 不一样?
来自WTForms docs:
Note that the choices keyword is only evaluated once, so if you want to make a dynamic drop-down list, you’ll want to assign the choices list to the field after instantiation.
根据文档页面示例,您必须执行以下操作:
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()
]