Python WTForms DateTimeField返回True无所谓输入

Python WTForms DateTimeField返回True无所谓输入,python,flask-wtforms,wtforms,Python,Flask Wtforms,Wtforms,我很难理解为什么WTForms总是验证我的输入,即使它与文档中规定的默认输入格式不匹配。文件说默认格式是 class wtforms.fields.DateTimeField(默认字段参数,格式=“%Y-%m-%d%H:%m:%S”) 但我的代码总是返回true from wtforms import Form, validators from wtforms.fields import DateTimeField class InputForm(Form): timestam

我很难理解为什么WTForms总是验证我的输入,即使它与文档中规定的默认输入格式不匹配。文件说默认格式是

class wtforms.fields.DateTimeField(默认字段参数,格式=“%Y-%m-%d%H:%m:%S”)

但我的代码总是返回true

from wtforms import Form, validators
from wtforms.fields import DateTimeField

class InputForm(Form):
        timestamp = DateTimeField('TimeStamp', validators=[validators.DataRequired()])

form = InputForm(timestamp='lmao')
form.validate()
# True

有人能给我解释一下这种行为吗?

简单地说,传递给字段的值是否可以强制为datetime没有被检查,因为您提供的验证器只检查数据的存在,而不是类型

datetime字段
确保可以将值强制为datetime,但仅当值来自表单时。正如您在下面看到的,通过kwargs(
timestamp='lmao'
)将值传递给表单构造函数不会通过相同的测试

查看的定义,对于作为datetime字段的字段,唯一具有自定义处理的方法是
process\u formdata()
方法(也是
\u value()
,但小部件用于呈现字段):

类日期时间字段(字段):
"""
一种文本字段,用于存储与格式匹配的'datetime.datetime'。
"""
widget=widgets.TextInput()
定义初始化__(
self,label=None,validators=None,format=“%Y-%m-%d%H:%m:%S”,**kwargs
):
超级(DateTimeField,self)。\uuuuu init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
self.format=格式
def_值(自身):
如果self.raw_数据:
返回“.join(self.raw_数据)
其他:
返回self.data和self.data.strftime(self.format)或“”
def过程表单数据(自身、值列表):
如果是价值清单:
加入日期(价值清单)
尝试:
self.data=datetime.datetime.strtime(date\u str,self.format)
除值错误外:
self.data=None
raise VALUERROR(self.gettext(“不是有效的日期时间值”))
实例化
表单
对象时,将调用表单的
过程()
方法,该方法调用每个表单字段的
过程()
方法,并传递
表单数据
(在本例中为
)和字段值(如果可以找到)(在本例中为
'lmao'

如您所见,上面的
DateTimeField
定义中没有定义
process()
方法,因此它调用
Field.process()

def进程(self、formdata、data=unset_值):
"""
根据需要处理传入数据、调用流程数据、流程表单数据、,
并运行过滤器。
如果未提供“数据”,则将在字段的
违约
字段子类通常不会覆盖此字段,而是覆盖
process_formdata和process_data方法。仅对
特殊的高级处理,例如当一个字段封装多个
投入。
"""
self.process_errors=[]
如果数据为未设置值:
尝试:
data=self.default()
除类型错误外:
data=self.default
self.object_data=数据
尝试:
自处理数据(数据)
除ValueError为e外:
self.process\u errors.append(e.args[0])
如果formdata不是无:
如果formdata中的self.name:
self.raw_data=formdata.getlist(self.name)
其他:
self.raw_data=[]
尝试:
self.process\u formdata(self.raw\u数据)
除ValueError为e外:
self.process\u errors.append(e.args[0])
尝试:
对于self.filters中的筛选器:
self.data=过滤器(self.data)
除ValueError为e外:
self.process\u errors.append(e.args[0])
在此方法中,
data
参数为
'lmao'
,而
formdata
参数为
None
。您可以看到,对
process\u formdata()
的调用由
保护,如果formdata不是None:
条件,那么
DateTimeField
上定义的字段的自定义处理只对来自表单的数据运行

来自werkzeug import MultiDict的

form=InputForm(formdata=MultiDict([(“时间戳”、“lmao”)]))
打印(表单.时间戳.原始数据)#['lmao']
打印(form.timestamp.process_errors)#['不是有效的日期时间值']
打印(form.validate())#错误

这意味着您要对通过kwargs传递到表单构造函数的表单字段中的值的有效性负责。

非常感谢您给出了完整的答案。