You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django日程页面日期标题重复显示问题求助

解决日程页面日期标题重复显示的问题

问题核心是当前模板会为每一条课程记录重复输出日期标题——因为你遍历的是按日期排序的课程列表,同一天的多个课程会重复触发日期标题的渲染。下面提供两种可行的解决方式:

方式一:使用Django模板的ifchanged标签(模板层快速处理)

直接在模板中判断日期是否变化,只有当日期不同时才渲染蓝色的日期标题项:

修改schedule.html:

{% extends 'app/layout.html' %}

{% block body %}
<ul class="list-group">
{% for lesson in subjects %}
    {% ifchanged lesson.day %}
    <li class="list-group-item active" aria-current="true">{{ lesson.day.name }}</li>
    {% endifchanged %}
    <li class="list-group-item">{{ lesson.title.title }}</li>
{% endfor %}
</ul>
{% endblock body %}

注:这里把变量名i改成了更语义化的lesson,同时调整了输出内容——直接显示日期名称和课程标题(原代码中i.day输出的是DaysOfWeek的__str__,包含ID;i.title是Subject对象,需要取title字段才能显示课程名)。

方式二:在视图层提前按日期分组(逻辑更清晰)

通过Python的itertools.groupby对课程按日期分组,再将分组后的数据传给模板渲染:

第一步:修改views.py

from itertools import groupby
from django.shortcuts import get_object_or_404, render

def showSchedule(request, ID):
    relevant_group = get_object_or_404(Students, id=ID)
    # groupby需要先排序才能正确分组,所以先按日期排序课程
    lessons = relevant_group.students.all().order_by("day")
    # 按日期对象分组
    grouped_lessons = groupby(lessons, key=lambda x: x.day)
    context = {"group": relevant_group, "grouped_lessons": grouped_lessons}
    return render(request, "app/schedule.html", context)

第二步:修改schedule.html

{% extends 'app/layout.html' %}

{% block body %}
<ul class="list-group">
{% for day, lessons in grouped_lessons %}
    <li class="list-group-item active" aria-current="true">{{ day.name }}</li>
    {% for lesson in lessons %}
    <li class="list-group-item">{{ lesson.title.title }}</li>
    {% endfor %}
{% endfor %}
</ul>
{% endblock body %}

两种方式对比:

  • 方式一适合快速修改,逻辑留在模板层;
  • 方式二将分组逻辑放在视图层,模板结构更简洁,也更便于后续扩展(比如添加日期相关的额外逻辑)。

内容的提问来源于stack exchange,提问作者user21251189

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 09:47:45