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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 14:19:58