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