gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 14:30:27 25 4
gpt4 key购买 nike

我有以下型号:

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 按月分组:

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的方式来处理这个逻辑?

最佳答案

我一直对 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com