2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

DjangoのテンプレートのIF文で複雑な四則演算を使いたい!→カスタムテンプレートを使うべし

Last updated at Posted at 2020-09-16

目的

Djangoにはテンプレートファイルを使う時に動的な処理をされたいときは組み込みタグとフィルタを使う。例えばIFとかFor文とか、あとはextendsとかblockとかも該当します。詳しは以下を参照ください。

参考:組み込みタグとフィルタ

今回やりたいことは、テンプレート内のifタグの中で剰余算です。
以下サンプルコード。

        {% for user in users%}
            {% if 余りが1の時 %}
                <div class="columns is-mobile">
            {% endif %}
            <div class="column">
                <div>
                    ~省略~
                </div>
            </div>
            {% if 余りが0の時 %}
                </div>
            {% endif %}
        {% endfor %}

既に提供されているタグでdivisiblebyのように割り切れたらTrueを返すというものはあるが、余りが1の時はこの処理、余りが2の時はこの処理...みたいなことは出来ません。

そんな時はカスタマテンプレートを用意すれば解決できる

カスタムテンプレートのやり方

まずはプロジェクト配下に以下のディレクトリとファイルを作ります。

project/
 ├ templatetags/
           └ tags.py

そしてsettings.pyファイルのINSTALLED_APPS 以下を追加

settings.py
INSTALLED_APPS = [
    'project',
]

tags.pyを以下のように編集

settings.py
from django import template

register = template.Library()

@register.filter
def modulo(num, val):
    return num % val

最後にカスタムテンプレートを使いたいtemplateでタグをロードしてあげればOK。
{% load templates %}が重要です。

{% load tags %}

~省略~

        {% for user in users%}
            {% if forloop.counter|modulo:3 == 1 %}
                <div class="columns is-mobile">
            {% endif %}
            <div class="column">
                <div>
                    ~省略~
                </div>
            </div>
            {% if forloop.counter|divisibleby:"3" %}
                </div>
            {% endif %}
        {% endfor %}

それではみなさま、よいDjangoライフを!

2
1
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
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?