【问题标题】:Why is my "time since" template filter not working?为什么我的“时间”模板过滤器不起作用?
【发布时间】:2015-02-16 22:47:08
【问题描述】:

我目前正在使用 Django-Messages,可以看到收到消息的确切日期和时间。我正在尝试构建一个模板过滤器,该过滤器采用接收到的日期/时间,然后计算它是否是今天、昨天、上周等。

收件箱.html

Inbox | Received Today
{% for message in messages %}
    {% if message.date|hours_ago:24 %}
        Today
        Sent by: {{ message.sender }}
        {{ message.body }}
    {% elif message.date|hours_ago:48 %}
        Yesterday
        Sent by: {{ message.sender }}
        {{ message.body }
    {% endif %}
{% endfor %}

模板过滤器

@register.filter
def hours_ago(time, hours):
    return time + timedelta(hours=hours) < timezone.now()

这目前不起作用。例如,{% if message.date|hours_ago:3 %} 将显示所有电子邮件,无论 message.date 值如何。

知道message.date本身(没有模板过滤器)以“Dec. 17, 2014, 6:21 am”的格式显示可能会有所帮助,我不知道这是否有什么与模板过滤器不起作用的原因有关。

【问题讨论】:

    标签: django django-templates django-template-filters


    【解决方案1】:

    尝试从 Python shell 调用您的 hours_ago() 函数,您会发现第一个问题:`

    >>> TypeError: can't compare datetime.datetime to function
    

    IOW,应该是:

    return time + timedelta(hours=hours) < timezone.now()
    

    注意括号...

    现在上面的表达式仍然不能如你所愿:

    >>> timezone.now()
    datetime.datetime(2014, 12, 18, 9, 26, 57, 920331)
    >>> t = datetime.datetime(2014, 11, 5)
    >>> hours_ago(t, 24)
    True
    >>> hours_ago(t, 48)
    True
    

    关键是:实际上您对传入的datetime 的函数检查是“超过hours 旧的”。这意味着对于 30 天前的日期时间,对于小于(大约)720 (=> 30 * 24) 的任何 hours 值,这将返回 True

    显然,您需要多考虑一下您希望这个过滤器能够准确地执行...首先编写单元测试也可能会有所帮助。

    【讨论】:

    • 是的,我在复制和粘贴时不小心忘记了 ()。我已经更新了原帖。
    • 那么你的过滤器逻辑错误......并且可能是一个不完整的规范,参见我更新的答案。
    猜你喜欢
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 2011-05-06
    • 2023-03-13
    • 2020-03-07
    • 1970-01-01
    相关资源
    最近更新 更多