我目前正在使用Django-Messages处理收件箱。现在,当我进入收件箱时,它列出了所有消息,但我想要做的是将消息组织到页面上的块中,到今天,昨天,上周等等。我目前有一个for循环遍历所有消息并显示它们。我想我需要在for循环中嵌入一个if语句,可能是这样的:
Inbox | Received Today
{% if message.date - current.date < 24 hours %}
Sent by: {{ message.sender }}
{{ message.body }}
{% elif message.date - current.date > 24 hours and message.date - current.date < 48 hours %}
Sent by: {{ message.sender }}
{{ message.body }
{% endif %}
我的问题是我应该为&#34; current.date&#34;?我知道我可以通过以下方式在python中找到当前日期:
datetime.datetime.now()
但我怎样才能在模板中得到这个?我是否需要先在视图中执行此操作,然后在模板中使用变量?
我也觉得我尝试这样做的方式可能效率不高?
答案 0 :(得分:3)
我会创建一个模板过滤器以在模板中使用。
在你的app目录中创建一个名为templatetags
的目录,然后在该目录中创建一个名为messages_tags.py
的文件(你可以随意命名)
messages_tags.py
的正文应如下:
# Use datetime if not localizing timezones
import datetime
# Otherwise use timezone
from django.utils import timezone
from django import template
register = template.Library()
@register.filter
def hours_ago(time, hours):
return time + datetime.timedelta(hours=hours) < datetime.datetime.now() # or timezone.now() if your time is offset-aware
现在您的模板变为:
{% load messages_tags %}
Inbox | Received Today
{% if message.date|hours_ago:24 %}
Sent by: {{ message.sender }}
{{ message.body }}
{% elif message.date|hours_ago:48 %}
Sent by: {{ message.sender }}
{{ message.body }
{% endif %}
您可能需要手动重启服务器才能让django识别新的模板标签。
另请注意,您不需要在elif中检查message.date超过24小时,因为如果小于24小时,则会执行第一个if
并且{{ 1}}甚至不会被考虑。
您还可以使用天数或datetime识别的任何其他时间值来检查消息的持续时间。如果你长时间回来检查,时间可能会变得混乱。