通过,往表单实例的,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,单独进行赋值处理。特殊情况下,肯定是可以的。 # 这也保留了灵活性。也希望,后期的项目中能用得上