我在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
中插入任何验证符,以及如何插入?
这里是DateField
中the 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.']