前言

最近折腾起来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('添加')