経緯
例えば、フロントで表示したいデータがこんな感じだとする。
goods = [
{'name':'だいこん', 'price': '100', 'genre':'野菜', 'made_in': '埼玉'},
{'name':'はまち', 'price': '500', 'genre':'魚', 'made_in': '富山'},
{'name':'すいか', 'price': '1000', 'genre':'野菜', 'made_in': '千葉'},
{'name':'かつお', 'price': '500', 'genre':'魚', 'made_in': '富山'},
{'name':'とけい', 'price': '10000', 'genre':'機械', 'made_in': '埼玉'},
{'name':'じてんしゃ', 'price': '20000', 'genre':'機械', 'made_in': '大阪'}
]
これらを、genreもしくはmade_inでまとめて表示したい。
結論
データをgenre、もしくはmade_inでsortした後、templateでregroupを使う。
(-> regroupはsortしてくれないので)
内容
まずはtemplateの内容。
{% regroup goods by genre as goods_list %}
<table class="table table-bordered table-sm">
{% for goods in goods_list %}
<thead>
<tr>
<th colspan="2" class="bg-primary">{{ goods.grouper }}</th>
</tr>
<tr class="bg-info">
<th>商品名</th>
<th>値段</th>
<th>産地</th>
</tr>
</thead>
<tbody>
{% for g in goods.list %}
<tr>
<td>{{ g.name }}</td>
<td>{{ g.price }}</td>
<td>{{ g.made_in }}</td>
</tr>
{% endfor %}
</tbody>
{% endfor %}
</table>
dataをsortしない場合
データがgenreでsortされていないので、野菜でまとまっていないが、機械はまとまっている…
dataをsortした場合
sortする。
new_goods_list = sorted(goods, key=lambda k: k['genre'])
すると、goodsは以下のようにsortされる。
$new_goods_list
[
{'name':'とけい', 'price': '10000', 'genre':'機械', 'made_in': '埼玉'},
{'name':'じてんしゃ', 'price': '20000', 'genre':'機械', 'made_in': '大阪'},
{'name':'だいこん', 'price': '100', 'genre':'野菜', 'made_in': '埼玉'},
{'name':'すいか', 'price': '1000', 'genre':'野菜', 'made_in': '千葉'},
{'name':'はまち', 'price': '500', 'genre':'魚', 'made_in': '富山'},
{'name':'かつお', 'price': '500', 'genre':'魚', 'made_in': '富山'}
]
made_inでまとめたい場合
1.made_inでsort
new_goods_list = sorted(goods, key=lambda k: k['made_in'])
2.templateでgroup by made_in
{% regroup goods by made_in as goods_list %}
<table class="table table-bordered table-sm">
{% for goods in goods_list %}
<thead>
<tr>
<th colspan="2" class="bg-primary">{{ goods.grouper }}</th>
</tr>
<tr class="bg-info">
<th>商品名</th>
<th>値段</th>
<th>産地</th>
</tr>
</thead>
<tbody>
{% for g in goods.list %}
<tr>
<td>{{ g.name }}</td>
<td>{{ g.price }}</td>
<td>{{ g.made_in }}</td>
</tr>
{% endfor %}
</tbody>
{% endfor %}
</table>
3.できあがり
以上。
参考