WTForms - встроенный перевод сообщений - PullRequest
1 голос
/ 14 октября 2019

Я использую Python 3.7.4 с Flask 1.1.1 и WTforms 2.2.1 в веб-приложении.

Я пытаюсь создать 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 и как?

1 Ответ

1 голос
/ 15 октября 2019

Вот определение DateField из источника :

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"))

Там вы можете увидеть, как ValueError поднимается из метода 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.']

Все поддерживаемые локали можно найти здесь и сопроводительную документацию здесь .

...