使用datetime.utcnow /可调用的WTForms StringField动态默认值?

时间:2018-11-23 17:36:13

标签: python flask flask-wtforms wtforms

我有一个带有以下内容的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

它声明默认为“可能是可调用的”。但是我还没有找到一个可行的例子。我假设如果使它可调用,则默认值将以当前时间戳更新。有谁知道如何使默认值从函数中获取其值?

预先感谢

布莱恩

1 个答案:

答案 0 :(得分:0)

在您的timestamp字段中,提供了一个可调用对象-datetime.datetime.utcnowdefault,因此,每次实例化表单时都会调用该可调用对象,并使用新结果。

在您的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()])