如何在Django模板中按天分组展示日志数据对象
Django日志按天分组展示实现方案
你可以选择以下任意一种方式实现需求,其中模板标签方式改动量最小,优先推荐。
方案1:使用Django内置regroup模板标签(推荐)
不需要修改现有视图逻辑,仅调整模板即可实现:
- 前置校验:现有代码中查询集已经通过
order_by('-created')按创建时间倒序排列,满足分组要求。注意:regroup标签要求数据必须预先按分组字段排序,否则会出现同日期数据被拆分成多个组的问题。 - 模板调整:替换
logs_list.html原有代码为以下内容:
{% regroup logs by created|date:"Y-m-d" as date_groups %} {% for group in date_groups %} <div class="mb-4"> <h5 class="text-uppercase font-weight-bold">{{ group.list.0.created|date:"F d, Y" }}</h5> <hr> {% for log in group.list %} <div class="row mb-2"> <div class="col-lg-12"> <p style="color:black;max-width:1000px;margin:0;"> {{ log.log|safe }} <small style="color:gray;" class="float-right">{{ log.created|date:"H:i A" }}</small> </p> </div> </div> {% endfor %} </div> {% endfor %}
说明:分组键使用Y-m-d纯数字日期格式,可避免多语言场景下月份名称差异导致的分组错误;组标题取分组内第一条数据的日期,格式化为大写的「月份 日, 年」格式,和预期展示效果完全一致。
方案2:后端视图层提前分组
如果需要在后端对分组数据做额外业务处理,可以在视图层通过itertools.groupby完成分组,再传给模板:
- 引入依赖:在
views.py顶部添加导入语句
from itertools import groupby
- 修改视图分组逻辑:调整视图类的
get_logs方法,完成按天分组
def get_logs(self): logs = Logs.objects.all().order_by('-created') # 按日期维度分组,key为日期对象,value为当天的所有日志 grouped_logs = {} for log_date, log_items in groupby(logs, key=lambda x: x.created.date()): grouped_logs[log_date] = list(log_items) return grouped_logs
- 调整模板遍历逻辑:修改
logs_list.html遍历分组后的数据
{% for log_date, log_items in logs.items %} <div class="mb-4"> <h5 class="text-uppercase font-weight-bold">{{ log_date|date:"F d, Y" }}</h5> <hr> {% for log in log_items %} <div class="row mb-2"> <div class="col-lg-12"> <p style="color:black;max-width:1000px;margin:0;"> {{ log.log|safe }} <small style="color:gray;" class="float-right">{{ log.created|date:"H:i A" }}</small> </p> </div> </div> {% endfor %} </div> {% endfor %}
内容的提问来源于stack exchange,提问作者Sagar
相关产品推荐
相关产品推荐

