1
votes

I have a WTForm with the following:

class MyForm(FlaskForm):
    ...
    timestamp = DateTimeField("Timestamp", default = datetime.utcnow, validators = [Required()])
    name = StringField("Name", default = str(int(datetime.utcnow().timestamp())), validators = [Optional()])
    ...

Upon creating a new form the default timestamp field updates as expected while the default name field continues to use the timestamp of when the app was started. I can successfully set the timestamp in my route, my preference is to utilize the default functionality of the form. Looking here:

The Field base class

It states that default "May be a callable." but I haven't been able to find a working example of this. I'm assuming if I make this a callable, the default value will update with current timestamp. Does anyone know how to make default get its value from a function?

Thanks in advance,

Brian

1

1 Answers

1
votes

In your timestamp field, you provide a callable - datetime.datetime.utcnow to default, so each time the form is instantiated the callable is called and the new result is used.

In your name field, datetime.datetime.utcnow().timestamp() is evaluated when the form is compiled, so the default value is the same for every instance of the form.

If you want the default value of name to be evaluated every time the form is instantiated, pass it a function (a callable) that returns datetime.datetime.utcnow().timestamp().

Like this:

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()])

or if you prefer, you can use a lambda:

class MyForm(FlaskForm):
    timestamp = DateTimeField("Timestamp", default=datetime.utcnow, validators=[Required()])
    name = StringField("Name", default=lambda : datetime.datetime.utcnow().timestamp(), validators=[Optional()])