• 2018-07-06
ウズマスター戦記
ウズマスター戦記 https://www.uzumax.org/2018/07/django-ifchanged.html

Djangoのテンプレートタグ 「ifchanged」 ループ中で前回と値が変わったかどうか判定

Djangoのはテンプレートタグ「ifchanged」ループの中で前回と値が変わったかどうかを判定するタグです。


用途

「ifchanged」はループ中の前回の値を参照し、同じだったらこうする、違っていたらこうする、という機能です。

従って用途としては、グルーピングを表現する時でしょうね。

例えば「部署」と「名前」を一覧表示するとします。
そんな時、このように「技術課」「営業課」「総務課」を全部の列に表示するならばifchanged出番はありませんが、


このように「最初の一人だけ部署を表示する」という表現をしたい場合、ifchangedの出番がやってきます。



では、実装行ってみましょう。

views.py

まず、送り込むコンテキストはこんな風になっているとします。
ここで注意というか当然ですが、ifchangedは「前回と同じか、違うか」を判定するだけの機能ですので、前もって都合の良いようにソートしておく必要があります。

このソースの場合は部署でグループする想定ですのでdepartmentでソートされたものになっています。

context = {}
list = []
list.append({"department": "技術課", "name": "Aさん"})
list.append({"department": "技術課", "name": "Bさん"})
list.append({"department": "営業課", "name": "Cさん"})
list.append({"department": "営業課", "name": "Dさん"})
list.append({"department": "営業課", "name": "Eさん"})
list.append({"department": "総務課", "name": "Fさん"})
list.append({"department": "総務課", "name": "Gさん"})

context["person_list"] = list

テンプレートタグの書き方

テンプレート側では「{% ifchanged person.department %}」と、ifタグと同じ要領でifchangedタグで括ってあげればOKです。

<table class="table table-striped table-bordered">
    <thead>
    <tr class="bg-primary">
        <td>部署</td>
        <td>名前</td>
    </tr>
    </thead>
    <tbody>
    {% for person in person_list %}
    <tr>
        <td>
            {% ifchanged person.department %}
                {{person.department}}
            {% endifchanged %}
        </td>
        <td>{{ person.name }}</td>
    </tr>
    {% endfor %}
    </tbody>
</table>

elseもOK

ifchangedはelseにも対応しています。(ifelsはありません)
こんな感じに書くことができます。
<table class="table table-striped table-bordered">
    <thead>
    <tr class="bg-primary">
        <td>部署</td>
        <td>名前</td>
    </tr>
    </thead>
    <tbody>
    {% for person in person_list %}
    <tr>
        <td>
            {% ifchanged person.department %}
                {{person.department}}
            {% else %}
                -
            {% endifchanged %}
        </td>
        <td>{{ person.name }}</td>
    </tr>
    {% endfor %}
    </tbody>
</table>


気になること

でも、これが出来るってことは、djangoはfor文中で以前の値を覚えておくことが出来るってことですよね。

ifchangedのソースは「django.template.defaulttags.py」の中にあります。

読んでみましたが……。う~ん、難しい。。。

もうちょっと勉強が必要そうです。

出展

公式サイトはこちら。


バックナンバー

0 件のコメント:

コメントを投稿

お気軽にコメント下さい。