flask - SelectField 的 Flask-WTF 默认值不适用于 SQLAlchemy 枚举类型
问题描述
我有一个 Flask-SQLAlchemy 站点,它对某些列使用SQLAlchemy 枚举类型,以限制可能的输入值。
例如,我有一个“支付类型”枚举,它有几个支付类型选项,如下所示:
class PaymentType(enum.Enum):
fixed = "fixed"
variable = "fixed_delivery"
quantity_discount = "quantity_discount"
当我在下拉/选择中使用它时,我可以指定如下选项:
prd_payment_type = SelectField(_('prd_payment_type'), choices=SelectOptions.PaymentTypes.All(0, _('PleaseSelect')))
我正在调用的 All() 函数将不同的枚举值作为选项返回,并且还在下拉列表中添加了一个自定义的“请选择...”选项。它看起来像这样:
class PaymentTypes(object):
@staticmethod
def All(blank_value=None, blank_text=None):
ret = [(i.value, _(i.name)) for i in PaymentType]
SelectOption.add_blank_item(ret, blank_value, blank_text)
return ret
到目前为止,一切都很好,我得到了一个不错的下拉菜单,其中包含正确的选项。当我想使用数据库中已经存在的 SQLAlchemy 对象显示表单时,就会出现问题。
当我从 SQLAlchemy 获取对象时,prd_payment_type属性包含enum PaymentType.quantity_discount
,而不仅仅是字符串值“quantity_discount”:
因为 WTForms(大概)将下拉列表中的预选选项与字符串值“quantity_discount”匹配,所以它与 SQLAlchemy 模型中的枚举不匹配,并且下拉列表中未选择该选项。
WTFormsSelectField
接受包含字符串的元组列表作为选项。我不能喂它我的枚举。另一方面,SQLAlchemy 模型返回一个枚举类型作为 prd_payment_type 的属性。我可能会覆盖这个属性或其他东西,但这感觉就像在 WTForms 中支持 SQLAlchemy 的枚举需要做很多工作。
是否有在 WTForms SelectField 中使用 SQLAlchemy 枚举的标准解决方案,或者我应该完全放弃使用枚举而只存储字符串,可能来自常量列表以保持它们处于检查状态?
解决方案
我自己找到了解决方案。似乎当枚举有一个
def __str__(self):
return str(self.value)
这足以让 WTForms 将数据库值与 SelectField 值匹配。我创建了一个派生自 enum.Enum 的基类,并添加了上面的代码以将枚举值作为字符串表示形式返回。
这个解决方案是基于我后来发现的这些类似问题:
推荐阅读
- sql - 计算 BigQuery 中时间戳之间的平均延迟
- javascript - 我如何使用 vanilla javascript 验证日期字段的年龄
- postgresql - 使用 TypeORM 持久化间接相关的分层数据
- c# - 如何根据方法中所做的处理返回一个泛型接口?
- php - Codeigniter - 根据年份获取表中列的总和,并应将其显示在输入标签中
- node.js - 制作群组视频通话应用程序 wrtc vs mediasoup
- javascript - React.js 鼠标,触摸事件不仅适用于手机屏幕
- docker - Kubernetes https://registry-1.docker.io/v2/:拨号tcp:查找registry-1.docker.io:名称解析暂时失败
- python - python xlsxwriter 独特的填充颜色
- python - b'\xffff' 和 b'\xff\xff' 有什么区别?