我有这个列表,它由来自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个问题。
我应该制作4个表并放置内联块吗?
答案 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>
这将创建许多嵌套表,但在视觉上它可以完成工作。
希望它有所帮助。