0

我有一组带有Flask-WTF的 SelectField ,并使用Flask-Babel转换默认语言。

这是我的代码片段:

from flask_babel import _, lazy_gettext as _l

class PaymentStatus(enum.Enum):
    PENDING = _l('PENDING')
    COMPLETED = _l('COMPLETED')
    EXPIRED = _l('EXPIRED')

    def __str__(self):
        return '{}'.format(self.value)

payment_status = [(str(_l(y)), y) for y in (PaymentStatus)]

class PaymentForm(FlaskForm):
    status_of_payment = SelectField(_l('Payment Status'), choices=payment_status)
    # ...
    # ...

这是我的模型:

class Payment(db.Model):
    __tablename__ = 'payment'
    id = db.Column(db.Integer, primary_key=True)
    status_of_payment = db.Column(db.Enum(PaymentStatus, name='status_of_payment'))
    # ...
    # ...

当我尝试将Flask-WTF表单中的值插入我的数据库时,我遇到了一些错误。

这是我如何将其插入数据库的片段:

if form.validate_on_submit():
    payment = Payment(
        # payment_status=form.status_of_payment.data
        payment_status=PaymentStatus.PENDING.value
        # ...
        # ...
    )

的值enum PENDING也在我的浏览器上转换为首选语言的语言,所以我收到了以下错误消息:

sqlalchemy.exc.StatementError: (builtins.LookupError) "MENGUNGGU" 不在定义的枚举值中

欲了解更多信息:“MENGUNGGU”= 是印尼语,表示英语中的“PENDING”。

所以这里的问题是,当我插入SelectField值时,它还会将该语言转换为我喜欢的浏览器语言,而我的PostgreSQL数据库会阻止它,因为我没有在我的枚举类型上定义值。

所以,我的问题的重点是,当我们想将值插入数据库时​​,我们是否可以从Flask-Babel中排除 i18n 和 l10n 值......?或者我应该怎么做才能面对这个......?

4

1 回答 1

2

您应该在选择中交换值,因为元组中的第一个元素是要提交的实际值,第二个是表示:

payment_status = [(y.name, _l(str(y.value))) for y in PaymentStatus]

多亏了这一点,您将提交翻译的名称和正确的值。

枚举的名称应该存储在您的数据库中,而不是值。

于 2019-10-02T15:14:09.563 回答