【问题标题】:WTForms StringField Dynamic Default Value using datetime.utcnow / Callable?使用 datetime.utcnow / Callable 的 WTForms StringField 动态默认值?
【发布时间】:2018-11-23 17:36:13
【问题描述】:

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

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

提前致谢,

布赖恩

【问题讨论】:

    标签: python flask flask-wtforms wtforms


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-04
      • 2018-12-31
      相关资源
      最近更新 更多