如何在Django中通过循环展示未来6天日期并关联对应数据?
解决Django模板循环展示未来日期及对应数据的问题
问题描述
我想通过循环创建列展示未来6天的日期,控制台里这段代码能正确输出日期,但不知道怎么在前端展示:
list=[1,2,3,4,5,6] for l in list: date = datetime.date.today() next_date=date+timedelta(days=l) print(next_date)
对应的Django模板代码:
{% for l in l %} <p>{{ l }} - {{next_date}}</p> {% endfor %}
这段模板会显示6行内容,但每行日期都一样。尝试直接循环next_data时,报错'datetime.date' object is not iterable。
目前我是手动定义6个日期变量来实现的,视图和模板代码如下,希望改成循环方式:
def Schedule(request): date = datetime.date.today() next_date1=date+timedelta(days=1) next_date2=date+timedelta(days=2) next_date3=date+timedelta(days=3) next_date4=date+timedelta(days=4) next_date5=date+timedelta(days=5) next_date6=date+timedelta(days=6) report=Submissions.objects.filter(Q(execution_date=date) | Q(execution_date=next_date1) | Q(execution_date=next_date2) | Q(execution_date=next_date3) | Q(execution_date=next_date4) | Q(execution_date=next_date5) | Q(execution_date=next_date6), status=4) context={ 'date':date, 'report':report, 'next_date1':next_date1, 'next_date2':next_date2, 'next_date3':next_date3, 'next_date4':next_date4, 'next_date5':next_date5, 'next_date6':next_date6, } return render(request, 'staff/work_schedule.html', context)
<table class="table table-striped table-hover"> <div style="width: 100%;background-color: rgb(0, 0, 0);color: white;font-weight: 800;font-size: 12px;">{{date|date:'d.m.Y'}}</div> <tbody> {% for qs in report %} {% if qs.execution_date|date:'d.m.Y' == date|date:'d.m.Y' %} <tr style="font-size: 10px;text-align: center;"> <th style="width: 8%;"><a style="text-decoration: none;color: black;" href="{% url 'system:ReportCard' qs.submissions_number_id qs.created %}">{{qs.client.user.get_full_name}}, tel.:{{qs.client.phone_number}}</a></th> <th style="width: 8%;">{{qs.client.post_code}} {{qs.client.city}}, ul.{{qs.client.street}}</th> <th style="width: 30%;">{{qs.contents|linebreaks|truncatewords_html:50}}</th> <th style="width: 30%;">{{qs.details_planned_service|linebreaks|truncatewords_html:50}}</th> <th style="width: 20%;"><a style="text-decoration: none;" href="{% url 'system:StatusUpdate' qs.submissions_number_id qs.created %}?next={{ request.path|urlencode }}"><span style="font-weight: 600;color: green;">{{qs.get_status_display}}</span></a></th> </tr> {% endif %} {% endfor %} </tbody> </table>
解决方案
1. 优化视图函数
把手动创建的6个日期变量改成日期列表,同时简化查询条件:
from datetime import datetime, timedelta from django.db.models import Q def Schedule(request): today = datetime.date.today() # 生成包含今天+未来6天的日期列表 date_range = [today + timedelta(days=i) for i in range(0,7)] # 简化查询:用__in匹配所有目标日期 report = Submissions.objects.filter( execution_date__in=date_range, status=4 ) context = { 'date_range': date_range, # 传递日期列表到模板 'report': report } return render(request, 'staff/work_schedule.html', context)
2. 修改模板代码
循环date_range列表,每个日期对应生成一个表格区块,并过滤出当天的报告:
{% for current_date in date_range %} <table class="table table-striped table-hover"> <div style="width: 100%;background-color: rgb(0, 0, 0);color: white;font-weight: 800;font-size: 12px;">{{ current_date|date:'d.m.Y' }}</div> <tbody> {% for qs in report %} {% if qs.execution_date == current_date %} <tr style="font-size: 10px;text-align: center;"> <th style="width: 8%;"><a style="text-decoration: none;color: black;" href="{% url 'system:ReportCard' qs.submissions_number_id qs.created %}">{{qs.client.user.get_full_name}}, tel.:{{qs.client.phone_number}}</a></th> <th style="width: 8%;">{{qs.client.post_code}} {{qs.client.city}}, ul.{{qs.client.street}}</th> <th style="width: 30%;">{{qs.contents|linebreaks|truncatewords_html:50}}</th> <th style="width: 30%;">{{qs.details_planned_service|linebreaks|truncatewords_html:50}}</th> <th style="width: 20%;"><a style="text-decoration: none;" href="{% url 'system:StatusUpdate' qs.submissions_number_id qs.created %}?next={{ request.path|urlencode }}"><span style="font-weight: 600;color: green;">{{qs.get_status_display}}</span></a></th> </tr> {% endif %} {% empty %} <tr style="font-size: 10px;text-align: center;"> <td colspan="5">当日无数据</td> </tr> {% endfor %} </tbody> </table> {% endfor %}
关键说明
- 视图层用列表推导式生成日期列表,避免重复代码,后续调整天数只需修改
range参数即可。 - 查询用
execution_date__in替代多个Q表达式,代码更简洁高效。 - 模板中直接循环日期列表,通过
qs.execution_date == current_date精准匹配当日数据,无需格式化字符串比较,更可靠。 - 加入
{% empty %}处理无数据场景,提升用户体验。
内容的提问来源于stack exchange,提问作者mattt
相关产品推荐
相关产品推荐

