Djangoのテンプレートで文字列を連結する方法

Djangoのテンプレートで文字列を連結する方法をご紹介します。

条件

  • Django 2.2.8
  • Python 3.7.0

テンプレートでの文字列連結

組み込みフィルタ「add」を使用します。

{{ value|add:"2" }}

このフィルタは、まず両方の値を強制的に整数とみなして加算しようとします。
失敗した場合は、とにかく値を足し合わせることを試みます。
これはいくつかのデータ型 (文字列、リストなど) では動作しますが、それ以外では失敗します。失敗した場合、結果は空の文字列になります。
出典:Djangoドキュメント

文字列を連結する際は、以下のように使用することが出来ます。

{% with template="string1/"|add:"string2" %}
    {{ template }}
{% endwith %}

上記は、「string1/」と「string2」を連結してtemplateという変数に代入しています。
templateを表示すると、「string1/string2」という値になります。

注意事項

addで連結するのもが文字列の場合、想定通りの結果となります。
しかし、連結しようとするものが文字列ではなく数値の場合、エラーが発生したり予期せぬ結果となります。

回避案

文字列連結用のカスタムタグを定義して使用します。

以下のようなファイルを作成します。
<appname>\templatetags\<appname>_extras.py

ソース

from django import template

register = template.Library()


@register.filter
def addstr(arg1, arg2):
    return str(arg1) + str(arg2)

テンプレートでは以下のように使用します。

{% load <appname>_extras %}


{% with template="3"|addstr:"4" %}
        {{ template }}
{% endwith %}

実行結果

34

3と4が文字列として連結された結果になります。
ちなみに「add」を使用した場合、3と4が加算されて7という結果になります。

使用例

一覧画面 > 詳細画面 という画面遷移がある状況において、詳細画面毎にIDに応じたテンプレートを読み込むことが出来ます。

ここでは、例として以下のプロジェクトで詳細画面毎のテンプレート読み込みを実装します。
https://github.com/kzmrt/works

レコード状態

workテーブルには以下のようなレコードが入っているものとします。

ソース

detail.html抜粋

object.pkを一旦、ASCIIに変換して連結し、連結した文字列のテンプレートを読み込みます。
すなわち、pictures/[id]/test.html というテンプレートを参照します。

<!-- テンプレート読み込み -->
{% with pk=object.pk|slugify %}
    {% with template="pictures/"|add:pk|add:"/test.html" %}
        {% include template %}
    {% endwith %}
{% endwith %}

テンプレート

テンプレート/<appname>の下に、以下のようにIDディレクトリを作成し、同じ名前のhtmlファイルを作成します。
(もちろん、作成するディレクトリは1つで、IDに応じたhtmlファイルを作成するのでもOKです。
その場合は、detail.htmlで読み込む文字列をそのような値にします。)

test.htmlはIDに応じて内容が異なるものとします。

  • 1/test.html
    • <h2>犬です!!</h2>
  • 2/test.html
    • <h2>狸です!!</h2>
  • 3/test.html
    • <h2>アライグマです!!</h2>

実行結果

一覧画面

詳細画面

IDごとに異なるテンプレートが読み込まれていることがわかります。

参考

stackoverflow:How to concatenate strings in django templates?

https://stackoverflow.com/questions/4386168/how-to-concatenate-strings-in-django-templates

Djangoドキュメント:組み込みタグとフィルタ(add)

https://docs.djangoproject.com/ja/2.2/ref/templates/builtins/#add

Djangoドキュメント:組み込みタグとフィルタ(slugify)

https://docs.djangoproject.com/ja/2.2/ref/templates/builtins/#slugify

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です