适当减少手机使用,有助于视力保护... 新的一年祝您:身体健康,阖家欢乐!~~

flask-wtf SelectField choices 值 动态加载导致验证时失败

浏览量:499 作者:admin 类别:: 整理于网络 更新时间:2023-04-24 08:40:40

通过,往表单实例的,SelectField choices 传值,会导致,所选中的值,不在原表单对象里的choise 值内,而报,SelectField未传值的错误。

 

网上,好多大神,发表此类问题,但没有更好的解决办法,此问题就此放置。

 

等待后期修复,或找到更好的解决方法。

 

网上,推荐使用普通 自定义的field 来实现。

 

 

 

 

最终得到解决:

曾经的尝试:

def validate(self, extra_validators=None):

    if extra_validators is not None:
        extra = extra_validators.copy()
    else:
        extra = {}
# 想办法重写 room_id的验证方式
    for name in self._fields:
        inline = getattr(self.__class__, f"validate_{name}", None)
        if inline is not None:
            extra.setdefault(name, []).append(inline)
    print(extra,super().validate(extra))
    extra_validators = extra
    # return super().validate(extra)
    # 下面是父级 验证器
    success = True
    for name, field in self._fields.items():
        if extra_validators is not None and name in extra_validators:
            extra = extra_validators[name]
        else:
            extra = tuple()
        print(name, field, extra)
        if not field.validate(self, extra): # and name != 'room_id':   # 强改
            print(field,'有问题了......')
            success = False
    return success

借鉴所得:

# 表单类中的新增
def __init__(self, *args, **kwargs):
    super(Room_insert_holds, self).__init__(*args, **kwargs)
    print(kwargs)

    if kwargs.get('rooms'):
        print("---",type(kwargs.get('rooms')))
        self.room_id.choices = kwargs.get('rooms')
    if kwargs.get('formdata'):
        print("---",type(kwargs.get('formdata')))
        self.formdata = kwargs.get('formdata')
    # self.city.choices = ((1, '篮球'), (2, '足球'), (3, '羽毛球'))
    
    
 
 视图类中增加:
 dict ={
    'rooms' : rooms, 'formdata' : request.form
}
form = Room_insert_holds(**dict)   
 
无论是get还是post,都要使用。

否则报错。

这里就完整实现了,动态改变 SelectField choices 值的目的。

此问题,困扰了一天了,终于在睡觉前,解决了。

感谢大神的心得:https://www.bbsmax.com/A/lk5aMwDm51/


补充一下:

表单类中:
def __init__(self, *args, **kwargs):
    super(Room_insert_holds, self).__init__(*args, **kwargs)
    print(kwargs)

    if kwargs.get('rooms'):
        print("---",type(kwargs.get('rooms')))
        self.room_id.choices = kwargs.get('rooms')
    # 可以注释掉    
    # if kwargs.get('formdata'):
    #     print("---",type(kwargs.get('formdata')))
    #     self.formdata = kwargs.get('formdata')
    # self.city.choices = ((1, '篮球'), (2, '足球'), (3, '羽毛球'))
    
    # 为什么说可以注释掉,不用这样多此一举,像引用老师心得那样呢?
    # 咱们看原码:
    在flalsk-wtf ,FlaskForm方法内72行,__init__方法代码:
    
    def __init__(self, formdata=_Auto, **kwargs):
          super().__init__(formdata=formdata, **kwargs)
          
          # 默认情况下,是不需要对formdata,单独进行赋值处理。特殊情况下,肯定是可以的。
          # 这也保留了灵活性。也希望,后期的项目中能用得上


关于博主
北京南城网络及弱电【张工】为您提供:
校园网、楼宇、村镇、园区,光纤网络覆盖,无线覆盖 华为|H3c|锐捷|爱快|panabit等品牌,路由、交换机、AC、AP 无源光网络(PON)设备,布署、调试、维运,等服务...
应急/临时光纤熔接...[藤仓22S]
博文为学习python所写:内容摘自网络、学习笔记、记事备忘。
QQ:872876353,欢迎交流学习、加Q注明来意。

诗文鉴赏

《满江红》· 岳飞
落星侵晓没,
残月半山低。
怒发冲冠,
凭栏处、潇潇雨歇。
抬望眼、仰天长啸,壮怀激烈。
三十功名尘与土,八千里路云和月。
莫等闲、白了少年头,
空悲切。
源于生活-记录日常
The site based on python 3 with flask...