wtform可以非常友好的管理好表单的交互以及服务端验证。最近开始使用postgres,发现也能非常友好的支持enum类型,但是在实际的操作中发现了一个bug。这里我们使用form.populate_obj方法从form中更新字段到obj,使用form.process(obj)方法从obj更新到form。sqlalchemy使用枚举类型定义的字段,form中使用selectfiled或者其子类。
修改了好多回,反反复复跟踪后才明确这个问题,在第一次给form赋值时无错,第一次保存时也无错,bug出在form的存储数据上,就是对field.data的操作。原来在wtform中会判断field.data是否是filed.choices中的值,源代码如下:
file:core.py
def pre_validate(self, form):
for v, _ in self.choices:
if self.data == v:
break
else:
raise ValueError(self.gettext('Not a valid choice'))
self.data有时候是form中选中input的value值,有时候是枚举类型,要修复这个bug就要在所有枚举类型的基础类BaseEnum上改写eq和hash两个内置函数,使得双等“==”操作既能比较字符串,也能比较枚举类型,修改后修复。