【问题标题】:loop over a list for specific(say first 3) values and then loop again for the next (next 3) values and iterate till the end in django template循环遍历特定(比如前 3 个)值的列表,然后再次循环下一个(下 3 个)值并在 django 模板中迭代直到结束
【发布时间】:2021-04-16 05:49:35
【问题描述】:

我的看法:

def dashboard(request):
    buses = get_bus_of_substation(request)
    data = []
    key = 1
    for bus in buses:
        for i in range(25):
            dt = datetime.datetime.today()
            tdelta = datetime.timedelta(hours=-i)
            dt = dt + tdelta
            date_time = dt.strftime('%Y-%m-%d %H:00:00')
            # print(date_time)
            sub_equip_id = bus.substation_equipment_id
            volt_value = get_voltage(date_time, sub_equip_id)
            # for volt in volt_value:
            #     print(volt.val)
            if volt_value:
                data.append(dt.strftime('%Y-%m-%d'))
                data.append(dt.strftime('%H:00:00'))
                for volt in volt_value:
                    data.append(volt.val)
                break
        if not volt_value:
            data.append('No Data')
            data.append('No Data')
            data.append('No Data')
    my_iter = iter(data)
    grouped_list = zip(my_iter, my_iter, my_iter)
    transformers = get_transformer_of_substation(request)

    return render(request, 'dashboard.html', context={'buses': buses, 'transformers': transformers, 'grouped_list': grouped_list})

我的模板:

<table class="table table-hover">
    <thead>
    <tr>
        <th scope="col">Bus Name</th>
        <th scope="col">Date</th>
        <th scope="col">Hour</th>
        <th scope="col">Voltage(kV)</th>
    </tr>
    </thead>
    <tbody>
    {% for bus in buses %}
    <tr class="table-active">

        <td>{{ bus.bus_name }}</td>
        {% for a,b,c in grouped_list %}
        <td>{{ a }}</td>
        <td>{{ b }}</td>
        <td>{{ c }}</td>
        {% endfor %}

    </tr>
    {% endfor %}
    </tbody>
</table>

我想在第一行打印前三个 list_values,在下一行打印下三个 list_values,依此类推。但是 grouped_list 将所有值打印在一行中。请建议我该怎么做

【问题讨论】:

  • 如果它的键只是 1,2,3,为什么你的字典是字典...使用 list 代替...
  • 我可以像字典一样在 django 模板中加载列表吗?以及如何访问模板内的列表?
  • {% for object in my_list %} {{ object }} {% endfor %}... 请展示你的观点。
  • 好的,列表会是更好的选择,我明白。但是使用列表,我如何以我在问题中提出的类似方式进行迭代?
  • 您的用例是否像有一个公共汽车列表,并且您想为他们呈现他们的data?结果是XY problem。这就是为什么你应该正确地说明你的问题到底是什么。

标签: python django loops dictionary templates


【解决方案1】:

在分组中迭代列表的常用技巧是创建一个迭代器并自行压缩。举个例子:

def my_view(request):
    my_list = [1, 2, 3, 4, 5, 6]
    my_iter = iter(my_list)
    grouped_list = zip(my_iter, my_iter, my_iter)
    return render(request, 'some_template.html', {'grouped_list': grouped_list})

现在在模板中我们可以简单地循环这个 zip 对象:

{% for a, b, c in grouped_list %}
    <td>{{ a }}</td>
    <td>{{ b }}</td>
    <td>{{ c }}</td>
{% endfor %}

编辑:从你的观点看来,你想做的事情与你所描述的完全不同。你有一个列表buses,如果我是正确的,你想显示你计算的data。在这种情况下,您应该制作一个适当的数据结构,以便能够在模板中正确呈现。例如,[{'bus': bus, 'bus_data': bus_data}, (Similar objects here)] 这样的结构更适合您的使用:

在您看来,请执行以下操作:

def dashboard(request):
    buses = get_bus_of_substation(request)
    data = []
    key = 1
    for bus in buses:
        bus_data = []
        for i in range(25):
            dt = datetime.datetime.today()
            tdelta = datetime.timedelta(hours=-i)
            dt = dt + tdelta
            date_time = dt.strftime('%Y-%m-%d %H:00:00')
            sub_equip_id = bus.substation_equipment_id
            volt_value = get_voltage(date_time, sub_equip_id)
            if volt_value:
                bus_data.append(dt.strftime('%Y-%m-%d'))
                bus_data.append(dt.strftime('%H:00:00'))
                for volt in volt_value:
                    bus_data.append(volt.val)
                break
        if not volt_value:
            bus_data.append('No Data')
            bus_data.append('No Data')
            bus_data.append('No Data')
        data.append({'bus': bus, 'bus_data': bus_data})
    return render(request, 'dashboard.html', context={'transformers': transformers, 'data': data})

现在在模板中你可以像这样循环data

{% for bus_dict in data %}
<tr class="table-active">
    <td>{{ bus_dict.bus.bus_name }}</td>
    {% for value in bus_dict.bus_data %}
    <td>{{ value }}</td>
    {% endfor %}
</tr>
{% endfor %}

【讨论】:

  • 感谢您的建议。我试过了,我想我已经很接近了。我正在尝试这个: {% for bus in buss %} {{ bus.bus_name }} {% for a,b,c in grouped_list %} {{ a }} {{ b }} {{ c }} {% endfor %} {% endfor %} I只想在第一行打印前三个值,在下一行打印接下来的三个值,依此类推。但是它将所有值打印在一行中。请给我建议一个方法。
  • @TaufiqueAlam edit 您的问题并在此处添加您的视图和此模板代码...
  • Zajakallahu Khairan。那效果很好。感谢所有的时间。我了解 XY 问题。在不久的将来,我会更详细地描述我的问题。
猜你喜欢
  • 2019-08-30
  • 2021-10-28
  • 2022-01-09
  • 1970-01-01
  • 2019-05-12
  • 2019-10-10
  • 2021-02-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多