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

Django中如何正确将循环数据从views.py传递至HTML模板?

解决Django中循环数据传递与模板渲染问题

你的核心问题在于:视图中循环机器时,condition变量会被每台机器的状态覆盖,最终仅保留最后一台机器的状态;同时模板未遍历machines列表,导致所有机器共用同一个状态判断结果。以下是正确的实现方式:

方法一:为每个机器对象添加自定义状态属性

修改views.py,给每台机器附加一个标记是否在运行的属性:

def allmachinesLOGO(request):
    machines = Machine.objects.all()
    # 遍历每台机器,添加自定义状态属性
    for machine in machines:
        # 判断当前机器是否有状态为"2"的关联订单
        machine.is_working = machine.tb_order_set.filter(status="2").exists()
    context = {'machines': machines}
    return render(request, 'pline/machineslogos.html', context)

在HTML模板中遍历machines列表,针对每台机器单独判断状态:

{% for machine in machines %}
    <div class="machine-item">
        {% if machine.is_working %}
            <h4>working</h4>
            <img class="btn-circle" style="width: 15px" src="{% static 'images/icons/icons8-green-circle-48.png' %}" alt="运行中" />
        {% else %}
            <h4>stop</h4>
            <img class="btn-circle" style="width: 15px" src="{% static 'images/icons/icons8-red-circle-48.png' %}" alt="已停止" />
        {% endif %}
    </div>
{% endfor %}

方法二:用数据库查询优化(避免N+1查询问题)

如果机器数量较多,上述循环会触发多次数据库查询(N+1问题),可以用Django的Exists子查询批量处理:

from django.db.models import Exists, OuterRef

def allmachinesLOGO(request):
    # 通过annotate批量为机器添加状态标记,仅需一次数据库查询
    machines = Machine.objects.annotate(
        is_working=Exists(
            # 关联当前机器的订单,筛选状态为"2"的记录
            machine.tb_order_set.filter(status="2", machine_id=OuterRef('pk'))
        )
    )
    context = {'machines': machines}
    return render(request, 'pline/machineslogos.html', context)

模板代码与方法一完全一致,无需修改。

关键说明

  • 视图中无需单独传递condition变量,直接将带有状态属性的machines列表传入模板即可。
  • 模板必须通过{% for %}标签遍历machines,才能为每台机器渲染对应的状态。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 07:20:33