我有以下型号:
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
的分组按月:
我正在试图弄清楚要显示这些事件的逻辑。单个月份选项卡应仅显示事件,而“稍后”选项卡应显示事件月份的标题,然后显示事件本身。最初我考虑为每个标签创建一个函数,所以类似于:
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方法来处理这种逻辑?
答案 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>
这是未经测试的,但应该向您发送正确的方向!