前言
最近折腾起来Flask,在使用WTForm的时候遇到了一点小问题。
当提交表单时,SelectField项提示错误Not a vaild choice.
正文
此时表单代码为:
class QuestionAddForm(FlaskForm):
type = SelectField('类型', choices=list(
{
1: '判断题',
2: '单选题',
3: '多选题',
}.items()
)) # 问题项
rank = IntegerField('难度', validators=[DataRequired()])
title = StringField('题目', validators=[DataRequired()])
data = HiddenField('数据', validators=[DataRequired()])
correct = HiddenField('正确答案', validators=[DataRequired()])
category = SelectField('分类', validators=[DataRequired()]) # 问题项
submit = SubmitField('添加')
表面看上去没有问题,正常使用理应不会出错,但表单提交之后却出现 (Not a vaild choice).
这是因为html里所有的表单数据都是字符串类型,当选项中的 1 提交之后变成了 '1' ,而 '1' 并不在choices之内,导致出错。
解决方案
给SelectField添加coerce项,当执行validate_on_submit进行验证时,会进行强制转型再验证。
class QuestionAddForm(FlaskForm):
type = SelectField('类型', coerce=int, choices=list(
{
1: '判断题',
2: '单选题',
3: '多选题',
}.items()
))
rank = IntegerField('难度', validators=[DataRequired()])
title = StringField('题目', validators=[DataRequired()])
data = HiddenField('数据', validators=[DataRequired()])
correct = HiddenField('正确答案', validators=[DataRequired()])
category = SelectField('分类', coerce=int, validators=[DataRequired()])
submit = SubmitField('添加')