WTForms StringField Динамическое значение по умолчанию с использованием datetime.utcnow / Callable? - PullRequest
0 голосов
/ 23 ноября 2018

У меня есть WTForm со следующим:

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

При создании новой формы поле отметки времени по умолчанию обновляется, как и ожидалось, в то время как поле имени по умолчанию продолжает использовать отметку времени при запуске приложения.Я могу успешно установить метку времени в моем маршруте, я предпочитаю использовать функциональные возможности формы по умолчанию.Смотрите здесь:

Базовый класс поля

В нем указано, что по умолчанию «Может быть вызываемым».но я не смог найти работающий пример этого.Я предполагаю, что если я сделаю это вызываемым, значение по умолчанию будет обновляться с текущей отметкой времени.Кто-нибудь знает, как заставить default получить его значение из функции?

Заранее спасибо,

Brian

1 Ответ

0 голосов
/ 24 ноября 2018

В вашем поле 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()])

или, если вы предпочитаетеВы можете использовать лямбда :

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