首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在for循环中按字典值分组

在for循环中按字典值分组
EN

Stack Overflow用户
提问于 2017-02-05 09:30:36
回答 3查看 120关注 0票数 2

我试图在django模板中按字典值对for循环进行分组。

我的模板如下:

代码语言:javascript
复制
<div id="engines-rows">
    {% for engine in engines %}
        <h3>{{ engine }}</h3>
    {% endfor %}
</div>

我得到的结果如下:

代码语言:javascript
复制
{'id': 8, 'name': '2.0 TFSI', 'fuel_type': 'PETROL', 'displacement_cc': 1984, 'power_hp': 188, 'power_ps': 190, 'power_kw': 140}
{'id': 7, 'name': '2.0 TDI', 'fuel_type': 'DIESEL', 'displacement_cc': 1968, 'power_hp': 181, 'power_ps': 184, 'power_kw': 135}
{'id': 6, 'name': '2.0 TDI', 'fuel_type': 'DIESEL', 'displacement_cc': 1968, 'power_hp': 148, 'power_ps': 150, 'power_kw': 110}
{'id': 5, 'name': '1.6 TDI', 'fuel_type': 'DIESEL', 'displacement_cc': 1598, 'power_hp': 109, 'power_ps': 110, 'power_kw': 81}
{'id': 4, 'name': '1.4 TFSI g-tron', 'fuel_type': 'CNG', 'displacement_cc': 1395, 'power_hp': 109, 'power_ps': 110, 'power_kw': 81}
{'id': 3, 'name': '1.4 TFSI e-tron', 'fuel_type': 'ELECTRICITY', 'displacement_cc': 1395, 'power_hp': 148, 'power_ps': 150, 'power_kw': 110}
{'id': 2, 'name': '1.4 TFSI', 'fuel_type': 'PETROL', 'displacement_cc': 1395, 'power_hp': 148, 'power_ps': 150, 'power_kw': 110}
{'id': 1, 'name': '1.0 TFSI', 'fuel_type': 'PETROL', 'displacement_cc': 999, 'power_hp': 114, 'power_ps': 116, 'power_kw': 85}

我想按fuel_type分组,因此我想看到如下内容:

汽油

名称:2.0TFSI -- displacement_cc: 1984 -- power_hp: 188 -- power_ps: 190 -- power_kw: 140名:1.4TFSI -- displacement_cc: 1395 - power_hp: 148 - power_ps: 150 - power_kw: 110 .

柴油

名称: 2.0 TDI -- displacement_cc: 1968 -- power_hp: 181 -- power_ps: 184 - power_kw: 135名称:2.0TDI -- displacement_cc: 1968 - power_hp: 148 - power_ps: 150 - power_kw: 110 .

.

我不能这样做

代码语言:javascript
复制
<div id="engines-rows">
    {% for engine in engines %}
        {% if engine.fuel_type == "PETROL" %}
            # Do something
        {% endif %}
        {% if engine.fuel_type == "DIESEL" %}
            # Do something
        {% endif %}
         # And so on
    {% endfor %}
</div>

但是我可以动态地做这件事,我不想为每一种燃料类型添加if。

谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-02-06 12:01:34

我解决了以下问题:

代码语言:javascript
复制
<div id="engines-rows">
    {% regroup engines|dictsort:"fuel_type" by fuel_type as fuel_type_list %}
    {% for fuel_type in fuel_type_list %}
        <div style="margin-bottom: 15px;">
            <div style="margin-bottom: 5px;background-color: #263238; color: #ffffff;height: 40px;display: block;padding: 10px 15px;border: 1px solid #ddd;">{{ fuel_type.grouper }}</div>
            {% for engine in fuel_type.list %}
                <a id="engine-row" class="col-lg-12" style="margin-bottom: 5px;" data-engine-id={{ engine.id }}>
                    <div class="col-lg-3" data-engine-id={{ engine.id }}>{{ engine.name }}</div>
                    <div class="col-lg-3" data-engine-id={{ engine.id }}>{{ engine.displacement_cc }} ccm</div>
                    <div class="col-lg-3" data-engine-id={{ engine.id }}>{{ engine.power_ps }} pk</div>
                    <div class="col-lg-3" data-engine-id={{ engine.id }}>{{ engine.power_kw }} kW</div>
                </a>
                <div class="clearfix" />
            {% endfor %}
        </div>
    {% endfor %}
</div>

YK的解决方案给出了我的:

汽油

名称:2.0TFSI -- displacement_cc: 1984 -- power_hp: 188 -- power_ps: 190 - power_kw: 140

柴油

名称: 2.0 TDI -- displacement_cc: 1984 -- power_hp: 188 -- power_ps: 190 -- power_kw: 140名称: 2.0 TDI -- displacement_cc: 1984 - power_hp: 188 - power_ps: 190 - power_kw: 140

CNG

名称:1.4TFSI g-电管-- displacement_cc: 1984 - power_hp: 188 - power_ps: 190 -- power_kw: 140

电气

名称:1.4TFSI电子控管-- displacement_cc: 1984 -- power_hp: 188 - power_ps: 190 -- power_kw: 140

汽油

名称:1.4TFSI -- displacement_cc: 1984 -- power_hp: 188 -- power_ps: 190 -- power_kw: 140名: 1.0 TFSI -- displacement_cc: 1984 - power_hp: 188 - power_ps: 190 - power_kw: 140

这不是我想要的。

如果您的数据位于字典列表中,则在文档中( Ilya V. Schurov发布的链接)仍然认为解决方案是使用独裁者排序筛选器对模板中的数据进行排序:

票数 0
EN

Stack Overflow用户

发布于 2017-02-05 09:47:05

我会考虑准备你认为的数据。

代码语言:javascript
复制
from collections import defaultdict

grouped_engines = defaultdict(list)

for engine in engines:
    grouped_engines[engine['fuel_type']].append(engine)

现在,您的模板可以简单得多。

基本结构如下所示:

代码语言:javascript
复制
{% for fuel_type, engines in grouped_engines.items %}
    {{ fuel_type }}
    {% for engine in engines %}
      {{ engine }}
    {% endfor %}
{% endfor %}

regroup标记也应该工作,但是将逻辑放在视图中感觉更接近Django对模板和逻辑的一般态度:

数据应在视图中计算,然后传递给模板显示。

票数 1
EN

Stack Overflow用户

发布于 2017-02-05 10:05:24

就像Ilya V. Schurov的评论中提到的那样

代码语言:javascript
复制
<div id="engines-rows">
    {% regroup engines by fuel_type as fuel_list %}
    {% for fuel in fuel_list %}
        <h2>{{ fuel.grouper }}</h2>
        {% for engine in fuel.list %}
            <h3>{{ engine }}</h3>
        {% endfor %}
    {% endfor %}
</div>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42050470

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档