我有以下型号:
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 个选项卡,分别显示当前月份、下个月、下个月,最后一个选项卡名为“Later”,应显示各个 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的方式来处理这个逻辑?
最佳答案
我一直对 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>
这尚未经过测试,但应该会给您带来正确的方向!
关于python - Django |以自定义格式显示按月分组的事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47346048/