我有以下的WTForm:
class MyForm(FlaskForm):
...
timestamp = DateTimeField("Timestamp", default = datetime.utcnow, validators = [Required()])
name = StringField("Name", default = str(int(datetime.utcnow().timestamp())), validators = [Optional()])
...
创建新表单后,默认时间戳字段将按预期更新,而默认名称字段将继续使用启动应用程序的时间戳。我可以在路线中成功设置时间戳,我的偏好是利用表单的默认功能。在这里看:
The Field base class
它指出默认为“可能是可调用的”。但是我还没有找到一个可行的例子。我假设如果使它可调用,则默认值将使用当前时间戳更新。有谁知道如何使默认值从函数中获取其值?
提前致谢,
布赖恩
最佳答案
在timestamp
字段中,提供一个可调用对象-datetime.datetime.utcnow
到default
,因此,每次实例化表单时,都会调用该可调用对象并使用新结果。
在您的name
字段中,编译表单时将评估datetime.datetime.utcnow().timestamp()
,因此对于表单的每个实例,默认值都相同。
如果希望每次实例化表单时都要评估默认值name
,则将返回datetime.datetime.utcnow().timestamp()
的函数(可调用)传递给它。
像这样:
def get_default():
datetime.datetime.utcnow().timestamp()
class MyForm(FlaskForm):
timestamp = DateTimeField("Timestamp", default=datetime.utcnow, validators=[Required()])
name = StringField("Name", default=get_default, validators=[Optional()])
或者,如果愿意,可以使用lambda:
class MyForm(FlaskForm):
timestamp = DateTimeField("Timestamp", default=datetime.utcnow, validators=[Required()])
name = StringField("Name", default=lambda : datetime.datetime.utcnow().timestamp(), validators=[Optional()])