Flask SelectField (Not a vaild choice) 错误解决

在使用Flask的WTForm时,遇到SelectField提交表单显示Not a valid choice错误。原因是HTML表单数据为字符串类型,与choices中定义的不匹配。解决方案是在SelectField中添加coerce参数,以确保数据类型转换后再进行验证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

最近折腾起来Flask,在使用WTForm的时候遇到了一点小问题。

当提交表单时,SelectField项提示错误Not a vaild choice.

正文

此时表单代码为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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进行验证时,会进行强制转型再验证。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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('添加')

 

 

原文链接:点击打开链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值