如何打印收到的日期'使用for循环时只有一次?

时间:2014-12-18 04:32:17

标签: python django django-templates

我正在尝试按今天收到的邮件进行分组,昨天收到,等等。为了澄清,我正在尝试使用单个标题“Today”,然后在下面列出这些消息。我不打算打印“今天”以及当天收到的每条消息(目前正在发生的事情)。

我目前在for循环中有TODAY和YESTERDAY标题,所以我明白这就是为每封邮件打印这些标题的原因,但如前所述,我只想打印一次。我的问题是,如何使用下面的代码实现这一目标?我是否需要为每个时间段(今天,昨天,上周等)制作单独的for循环,或者是否有更有效的方法来执行此操作?

{% for message in messages %}
    {% if message.date - current.date < 24 hours %}
        TODAY
        Sent by: {{ message.sender }}
        {{ message.body }}
    {% elif message.date - current.date > 24 hours and message.date - current.date < 48 hours %}
        YESTERDAY
        Sent by: {{ message.sender }}
        {{ message.body }
    {% endif %}
{% endfor %}

2 个答案:

答案 0 :(得分:1)

您可以使用{{forloop.first}}。所以你的代码可以更新到

{% for message in messages %}
    {% if message.date - current.date < 24 hours %}
        {% if forloop.first %}
            TODAY
        {% endif %}
    {% elif message.date - current.date > 24 hours and message.date - current.date < 48 hours %}
       {% if forloop.first %}
        YESTERDAY
       {% endif %}
    {% endif %}

    Sent by: {{ message.sender }}
    {{ message.body }}

{% endfor %}

答案 1 :(得分:1)

  

我正在尝试按今天收到的邮件进行分组,昨天收到

@Rohan给了你一个答案但是它会在每个循环上运行检查,即使你只打印出一次字符串。

更好的方法是整理邮件并按日期差异进行排序。

执行此操作的最佳方法是在将消息发送到模板之前对视图中的消息进行分组,如下所示:

from collections import defaultdict
from django.utils.timesince import timesince  # This will give us nice human
                                              # friendly date offsets

def some_view(request):

   messages = Message.objects.order_by('date')
   grouped_messaged = defaultdict(list)
   for message in messages:
      grouped_messages[timesince(message.date)].append(message)

   return render(request, 'template.html', {'all_messages': messages})

现在你的模板更简单了:

<ul>
{% for header,messages in all_messages.items %}
    <li>{{ header }}
    <ul>
    {% for message in messages %}
        <li>{{ message.sender }} - {{ message.body }}</li>
    {% endfor %}
    </ul></li>
{% endfor %}
</ul>