代码之家  ›  专栏  ›  技术社区  ›  Steve Piercy

如何在colander验证器中格式化日期?

  •  0
  • Steve Piercy  · 技术社区  · 6 年前

    用户金字塔、Colander和Deform,我有一个datetime小部件。

    datetime_event = colander.SchemaNode(
        colander.DateTime(),
        validator=colander.Range(
            min=datetime(
                2018, 1, 1, 0, 0,
                tzinfo=timezone.utc),
            min_err=(
                '${val} must be after ${min}'),
            max=datetime.now(timezone.utc),
            max_err=(
                '${val} is in the future, and must be less than ${max}')
        ),
    )
    

    我收到这个用户恶意验证错误消息。

    2017-08-21 05:00:00-07:53必须在2018-01-01 00:00:00+00:00之后

    我想格式化没有时区的日期:

    或者更好:

    2017年8月21日上午5:00必须在2018年1月1日上午12:00之后

    如果可能的话,我将如何格式化中的datetime对象 min_err max_err

    1 回复  |  直到 6 年前
        1
  •  0
  •   Steve Piercy    6 年前

    这是我最后用的。关键是不使用默认变量 ${val} 使用普通的Python f字符串。

    tz = self.tz
    days_before = 28
    dtmin = local_days_before(tz, days_before)  # localized min date
    dtmax = datetime.now(utc).astimezone(tz)
    datetime_event = colander.SchemaNode(
        colander.DateTime(default_tzinfo=dtmax.tzinfo),
        widget=deform.widget.DateTimeInputWidget(
            date_options={'min': -days_before,
                          'max': True,
                          'format': 'yyyy-mm-dd'},
            time_options={'format': 'HH:i',
                          'formatLabel': 'HH:i'},
        ),
        validator=colander.Range(
            min=dtmin,
            min_err=(f"Datetime must be after "
                     f"{dtmin:%B %d, %Y, %-I:%M %p} "),
            max=dtmax,
            max_err=(f"Datetime must be before "
                     f"{dtmax: %B %d, %Y, %-I:%M %p}")
        ),
        title='Date and Time',
        description='Date and time when the event occurred'
    )
    

    此解决方案还实现了日期和时间的格式化,以及pickadate UI中的最小和最大日期。

    推荐文章