SelectField的Flask-WTF默认设置不适用于SQLAlchemy枚举类型

时间:2018-11-22 21:32:53

标签: flask sqlalchemy flask-sqlalchemy flask-wtforms wtforms

我有一个Flask-SQLAlchemy网站,该网站对某些列使用SQLAlchemy enum type,以限制可能的输入值。

例如,我有一个“付款类型”枚举,其中有一些付款类型选项,例如:

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 属性包含枚举 PaymentType.quantity_discount,而不仅仅是字符串值'quantity_discount': enter image description here

因为WTForms(大概)将下拉列表中的预选选项与字符串值“ quantity_discount”匹配,所以它与SQLAlchemy模型中的枚举不匹配,并且未在下拉列表中选择该选项。

WTForms的SelectField接受包含字符串的元组列表作为选择。我无法喂它枚举。 另一方面,SQLAlchemy模型返回枚举类型作为prd_payment_type的属性。我也许可以重写此属性或其他内容,但这在支持WTForms中的SQLAlchemy枚举方面需要做很多工作。

是否存在用于在WTForms SelectField中使用SQLAlchemy枚举的标准解决方案,还是应该放弃使用枚举而仅存储字符串(也许是从常量列表中进行检查)以使它们保持检查状态?

1 个答案:

答案 0 :(得分:0)

我自己找到了解决方案。似乎当枚举有

def __str__(self):
    return str(self.value)

对于WTForms来说,将数据库值与SelectField值匹配就足够了。 我做了一个从enum.Enum派生的基类,并添加了上面的代码以枚举字符串形式返回枚举值。

此解决方案基于我稍后发现的这些类似问题:

https://github.com/flask-admin/flask-admin/issues/1315

Python Flask WTForm SelectField with Enum values 'Not a valid choice' upon validation

相关问题