WTForms-内置消息翻译

问题描述 投票:0回答:1

我在Web应用程序中使用带有Flask 1.1.1和WTforms 2.2.1的Python 3.7.4。

我正在尝试这样创建DateField

user_birth = DateField('Datum narození', format='%d-%m-%y')

如果用户错误填写日期并提交,则会出现消息:“无效的日期值”,我想用英语以外的其他语言(例如捷克语)显示。

StringField中,我这样做的方式是:

username = StringField('Přezdívka', [validators.Length(min=1, max=30, message='Pole musí obsahovat hodnotu od 1 do 30 znaků.')])

但是对于DateField,我无法放置任何验证器。

问题:是否可以在DateField中插入任何验证符,以及如何插入?

python wtforms
1个回答
0
投票

这里是DateFieldthe source的定义:

class DateField(DateTimeField):
    """
    Same as DateTimeField, except stores a `datetime.date`.
    """

    def __init__(self, label=None, validators=None, format="%Y-%m-%d", **kwargs):
        super(DateField, self).__init__(label, validators, format, **kwargs)

    def process_formdata(self, valuelist):
        if valuelist:
            date_str = " ".join(valuelist)
            try:
                self.data = datetime.datetime.strptime(date_str, self.format).date()
            except ValueError:
                self.data = None
                raise ValueError(self.gettext("Not a valid date value"))

您可以在process_formdata()方法中看到一个值错误,该错误不允许您提供特定的错误消息。但是,请注意,错误消息包装在对self.gettext()的调用中-这是为了进行消息翻译,并且提供了CZ翻译。

翻译对象从Form对象传递到表单字段,因此您可以基于实例设置翻译,也可以使用类继承为所有表单设置翻译。

按形式翻译

from wtforms import DateField, Form
from werkzeug.datastructures import MultiDict


class MyForm(Form):
    user_birth = DateField('Datum narození', format='%d-%m-%y')


if __name__ == "__main__":
    # this fakes an invalid form from webserver
    request_form = MultiDict([("user_birth", "invalid date")])
    form = MyForm(request_form, meta={'locales': ['cs_CZ']})
    print(form.user_birth.process_errors)  # ['Neplatná hodnota pro datum.']

使用通用基类进行翻译:

class BaseForm(Form):
    class Meta:
        locales = ['cs_CZ']


class MyForm(BaseForm):
    user_birth = DateField('Datum narození', format='%d-%m-%y')


if __name__ == "__main__":
    request_form = MultiDict([("user_birth", "invalid date")])
    form = MyForm(request_form)
    print(form.user_birth.process_errors)  # ['Neplatná hodnota pro datum.']

可以找到所有受支持的语言环境here,以及支持的文档here

© www.soinside.com 2019 - 2024. All rights reserved.