Flask WTForms中SelectField表单报错Not a vaild choice解析

关于这个问题,是我在看了源码之后才发现的

class SelectField(SelectFieldBase):
    widget = widgets.Select()

    def __init__(self, label=None, validators=None, coerce=text_type, choices=None, **kwargs):
        super(SelectField, self).__init__(label, validators, **kwargs)
        self.coerce = coerce
        self.choices = copy(choices)

    def iter_choices(self):
        for value, label in self.choices:
            yield (value, label, self.coerce(value) == self.data)

    def process_data(self, value):
        try:
            self.data = self.coerce(value)
        except (ValueError, TypeError):
            self.data = None

    def process_formdata(self, valuelist):
        if valuelist:
            try:
                self.data = self.coerce(valuelist[0])
            except ValueError:
                raise ValueError(self.gettext('Invalid Choice: could not coerce'))

    def pre_validate(self, form):           #预验证函数
        for v, _ in self.choices:
            if self.data == v:
                break
        else:
            raise ValueError(self.gettext('Not a valid choice'))

可以看到这里有个pre_validate()类方法,这个pre_应该就是后端响应(下面代码)前端提交按钮后会自动触发的格式,和validate_一样

if form.validate_on_submit():

我们来看这个这个预验证函数,发现内容很简单,就是验证当前选择值是否能在我在后端定义表单时赋的choices值里被找到。找不到就报错Not a vaild choice。

一般你如果没有用javaScript重写前端表单的option,且这个option 的value值在你的后端定义的choices里面是不会报这个错的。

所以出现这种问题解决的方法就是看看你后端表单中的choices是不是包含表单提交时当前option的选项。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值