Django |按自定义格式显示按月分组的事件?

时间:2017-11-17 08:13:44

标签: python django django-templates

我有以下型号:

class Event(Page)
    # my fields
    start_date = models.DateField()
    end_date = models.DateField()

class EventsIndex(Page):
    # my fields

    def get_events(self):
        events = Event.objects.all().sort_by("start_date")
        return events

在我的EventsIndex模板中,我有4个标签显示当前月份,下个月,下一个月,然后是最后一个名为“稍后”的标签,该标签应显示个人Event的分组按月:

enter image description here

我正在试图弄清楚要显示这些事件的逻辑。单个月份选项卡应仅显示事件,而“稍后”选项卡应显示事件月份的标题,然后显示事件本身。最初我考虑为每个标签创建一个函数,所以类似于:

def current_month_events(self):
    current_month, current_year = datetime.now().month, datetime.now().year
    events = Event.objects.filter(start_date__year=current_year, 
                  start_date__month=current_month).order_by("start_date")
    return events

# Repeat for all required tabs

然而,这似乎与DRY原则背道而驰。是否有更多的pythonic方法来处理这种逻辑?

1 个答案:

答案 0 :(得分:1)

我一直对Django中缺乏对此类事物的支持感到非常恼火。

除非你正在做aggregation,否则它的支持并不是很好。

我能找到的最为pythonic / Djangorrific方式is in the template, using groupby there。 (在我看来,这违背了不将业务逻辑放在模板中的概念,但你有。)

在您的情况下,您可以在views.py文件中执行以下操作:

from datetime import date, timedelta
today = date.today()
four_months_time  = today + timedelta(months=4)
events = Event.objects.filter(start_date__gte=today, start_date__lte= 
                  four_months_time).order_by("start_date")`

并在模板中(假设您将events作为变量传回):

{% regroup events by start_date.month as events_list %}
<ul>
{% for event in events_list %}
    <li>{{ event.grouper }}
    <ul>
        {% for event in event.list %} 
          <li>{{event}}</li>
        {% endfor %}
    </ul>
    </li>
{% endfor %}
</ul>

这是未经测试的,但应该向您发送正确的方向!