我目前正在使用Django-Messages,可以看到收到邮件的确切日期和时间。我正在尝试构建一个模板过滤器,它接收收到的日期/时间,然后计算它是否是今天,昨天,上周等。
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”的格式显示可能会有所帮助,我不知道这是否有什么为什么模板过滤器不起作用。
答案 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
。
显然你需要多考虑一下你期望这个过滤器完全正确...首先编写单元测试也可能有所帮助。