LoginSignup
0
0

More than 3 years have passed since last update.

DjangoのTemplateでcontext_dataをgroupしたい => regroupを使う

Last updated at Posted at 2021-03-09

経緯

例えば、フロントで表示したいデータがこんな感じだとする。

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されていないので、野菜でまとまっていないが、機械はまとまっている…
image.png

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': '富山'}
]

なので、表示は以下のようになる。
image.png

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.できあがり

image.png

以上。

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0