SelectField 的 Flask-WTF 默认值不适用于 SQLAlchemy 枚举类型
Flask-WTF default for a SelectField doesn't work for SQLAlchemy enum types
我有一个 Flask-SQLAlchemy 站点,它对某些列使用 SQLAlchemy enum type 来限制可能的输入值。
例如,我有一个 "payment type" 枚举,其中有几个支付类型选项,如下所示:
class PaymentType(enum.Enum):
fixed = "fixed"
variable = "fixed_delivery"
quantity_discount = "quantity_discount"
当我在 dropdown/select 中使用它时,我可以像这样指定选项:
prd_payment_type = SelectField(_('prd_payment_type'), choices=SelectOptions.PaymentTypes.All(0, _('PleaseSelect')))
我调用的 All() 函数 returns 将不同的枚举值作为选项,并且还在下拉列表中添加了自定义 "Please select..." 选项。它看起来像这样:
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 模型中的枚举不匹配,并且未在下拉列表中选择该选项。
WTForms 的 SelectField
接受包含字符串的元组列表作为选择。我不能用我的枚举来喂它。
另一方面,SQLAlchemy 模型 returns 枚举类型作为 prd_payment_type 的 属性。我也许可以覆盖这个 属性 或其他东西,但感觉要在 WTForms 中支持 SQLAlchemy 的枚举需要做很多工作。
是否有在 WTForms SelectField 中使用 SQLAlchemy 枚举的标准解决方案,或者我是否应该完全放弃使用枚举而只存储字符串,也许来自常量列表以检查它们?
我自己找到了解决办法。似乎当枚举有一个
def __str__(self):
return str(self.value)
这足以让 WTForms 将数据库值与 SelectField 值相匹配。
我创建了一个派生自 enum.Enum 的基类,并将上面的代码添加到 return 枚举值作为字符串表示形式。
此解决方案基于我后来发现的这些类似问题:
https://github.com/flask-admin/flask-admin/issues/1315
Python Flask WTForm SelectField with Enum values 'Not a valid choice' upon validation
我有一个 Flask-SQLAlchemy 站点,它对某些列使用 SQLAlchemy enum type 来限制可能的输入值。
例如,我有一个 "payment type" 枚举,其中有几个支付类型选项,如下所示:
class PaymentType(enum.Enum):
fixed = "fixed"
variable = "fixed_delivery"
quantity_discount = "quantity_discount"
当我在 dropdown/select 中使用它时,我可以像这样指定选项:
prd_payment_type = SelectField(_('prd_payment_type'), choices=SelectOptions.PaymentTypes.All(0, _('PleaseSelect')))
我调用的 All() 函数 returns 将不同的枚举值作为选项,并且还在下拉列表中添加了自定义 "Please select..." 选项。它看起来像这样:
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 模型中的枚举不匹配,并且未在下拉列表中选择该选项。
WTForms 的 SelectField
接受包含字符串的元组列表作为选择。我不能用我的枚举来喂它。
另一方面,SQLAlchemy 模型 returns 枚举类型作为 prd_payment_type 的 属性。我也许可以覆盖这个 属性 或其他东西,但感觉要在 WTForms 中支持 SQLAlchemy 的枚举需要做很多工作。
是否有在 WTForms SelectField 中使用 SQLAlchemy 枚举的标准解决方案,或者我是否应该完全放弃使用枚举而只存储字符串,也许来自常量列表以检查它们?
我自己找到了解决办法。似乎当枚举有一个
def __str__(self):
return str(self.value)
这足以让 WTForms 将数据库值与 SelectField 值相匹配。 我创建了一个派生自 enum.Enum 的基类,并将上面的代码添加到 return 枚举值作为字符串表示形式。
此解决方案基于我后来发现的这些类似问题:
https://github.com/flask-admin/flask-admin/issues/1315
Python Flask WTForm SelectField with Enum values 'Not a valid choice' upon validation