为什么我的"时间和#34;模板过滤器不工作?

时间:2014-12-18 07:54:39

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

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

Inbox.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本身(没有模板过滤器)以“2014年12月17日上午6:21”的格式显示可能会有所帮助,我不知道这是否有什么为什么模板过滤器不起作用。

1 个答案:

答案 0 :(得分:0)

尝试从Python shell调用hours_ago()函数,然后您将了解第一个问题:`

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

IOW,那应该是:

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

注意到parens ......

现在上面的表达仍然没有做你希望的事情:

>>> 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传入的功能检查是&#34;超过hours旧&#34;。这意味着对于30天的日期时间,对于True小于(大约)hours(=&gt; 720)的任何值,这将返回30 * 24

显然你需要多考虑一下你期望这个过滤器完全正确...首先编写单元测试也可能有所帮助。