从字典列表中使用Django生成多行/列表

时间:2015-01-15 16:57:01

标签: django

我有这个列表,它由来自Django查询的多个词典组成:

它是音乐学校每场课程中多种乐器的统计汇总。

[{'count': 13, 'session': 1, 'instrument': u'Piano'}, {'count': 4, 'session': 1, 'instrument': u'Cello'}, {'count': 2, 'session': 1, 'instrument': u'Violin'}, {'count': 14, 'session': 2, 'instrument': u'Piano'}, {'count': 1, 'session': 4, 'instrument': u'Cello'}]

如何通过循环来创建一个包含4列和n行的表,知道总会有4个会话但是有多个intruments?

我尝试的几乎输出了我想要的东西(我的模板):

        <table class="table">
        <thead>
        <tr>
            <th>Session 1</th>
            <th>Session 2</th>
            <th>Session 3</th>
            <th>Session 4</th>
        </tr>
        </thead>
        {% for stat in stats_instrument %}
                {% if stat.session == 1 %}
                <tr><td>{{ stat.instrument }} {{ stat.count }}</td></tr>
                {% endif %}
        {% endfor %}
        {% for stat in stats_instrument %}
                {% if stat.session == 2 %}
                <tr><td></td><td>{{ stat.instrument }} {{ stat.count }}</td></tr>
                {% endif %}
        {% endfor %}
     ...
    </table>

实际输出是:

|Session 1| Session 2| Session 3| Session 4|
|Piano 13 |
|Cello 4  |
|Violin 2 |
|         | Piano 14 |
|         |          |           | Cello 1 |

我想要的更像是:

|Session 1| Session 2| Session 3| Session 4|
|Piano 13 | Piano 14 |          | Cello 1  |
|Cello 4  |
|Violin 2 |

我看到3个问题。

  1. 每个会议的乐器都不一样,所以钢琴可以在1-2-3的课程中进行教学。
  2. 会议中没有相同数量的乐器,会话1可以有大约5个乐器,会话3可以有10个乐器。
  3. 我循环多次相同的数据,看起来效率不高。
  4. 我应该制作4个表并放置内联块吗?

1 个答案:

答案 0 :(得分:2)

您可以先在视图中订购表格,然后为模板提供一个简单的有序列表。

首先按会话编号

对它们进行分组
sessions = [{'count': 13, 'session': 1, 'instrument': u'Piano'}, {'count': 4, 'session': 1, 'instrument': u'Cello'}, {'count': 2, 'session': 1, 'instrument': u'Violin'}, {'count': 14, 'session': 2, 'instrument': u'Piano'}, {'count': 1, 'session': 4, 'instrument': u'Cello'}]

values = set(map(lambda x:x['session'], sessions))
grouped_sessions = [[y for y in sessions if y['session']==x] for x in values]
那么你应该有类似的东西:

[[{'count': 13, 'session': 1, 'instrument': u'Piano'}, {'count': 4, 'session': 1, 'instrument': u'Cello'}, {'count': 2, 'session': 1, 'instrument': u'Violin'}],[{'count': 14, 'session': 2, 'instrument': u'Piano'}],[{'count': 1, 'session': 4, 'instrument': u'Cello'}]]

现在在你的模板中,在for循环中执行for循环,如:

<table><thead>...</thead><tbody>
<tr>
{% for g in grouped_sessions %}
    <td><table>
    {% for s in g %}
     <tr><td>{{s.instrument}} {{s.count}}</td></tr>
    {% endfor %}
    </table></td>
{% endfor %}
</tr>

这将创建许多嵌套表,但在视觉上它可以完成工作。

希望它有所帮助。