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

标签 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 个选项卡,分别显示当前月份、下个月、下个月,最后一个选项卡名为“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/

相关文章:

python - Pydub 在目录中连接 mp3

django - Docker compose 用于生产和开发

python - Django 下载模板中的文件 Url

python - 评估 bool 表达式并注释结果

python每3次迭代添加一个新的div

python - 如何找到 pandas.DataFrame 中值的位置?

python - Pytorch 可微分条件(基于索引)和

java - 自定义数组排序

javascript - Django - 没有 JQuery 库的 Ajax

python - 在 Django 模板中使用字典格式化翻译字符串的好方法?