Flask Babel 在插入数据库时​​转换为原始语言

Flask Babel convert to original language when insert to database

我有一组带有 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" is not among the defined enum values

了解更多信息:"MENGUNGGU" = 英语 "PENDING" 是印度尼西亚语。

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

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

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

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

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

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