SE_BOKUのまとめノート的ブログ

SE_BOKUが知ってること・勉強したこと・考えたことetc

Djangoテンプレート内での値の参照(変数・List・辞書)とフィルタ機能について

f:id:arakan_no_boku:20191230001930p:plain

目次

今回は、Djangoテンプレート内での以下の2つについてです。。

  • 変数の参照方法
  • 変数の表示時に使う主なフィルター 

Djangoテンプレートでの変数参照 

djangoテンプレート内では「{{ verb }}」の形で変数を参照します。

基本的に文字列・数字等は「{{ var }}」の様に、{{ }}の中に変数を書くだけです。

List・tapple・辞書はドットで添え字を参照

Listとかtappleなどの参照の場合は、{{ var[0] }} みたいには書けません。

書くとエラーになります。

例えば。

「lst = ['A', 'B']」のようなListで「A」を表示する場合、Pythonだと、lst[0]です。

しかし、djangoテンプレートでは「lst.0」の様に「.(ドット)」の後ろに添え字を指定する必要があります。

辞書も同じです。

dic={’キー':'値'} みたいな辞書があると。

dic.キー

みたいに、ドット(.)の後ろに、キー文字列を指定します。

表にまとめると以下のようになります。

Python 参照の仕方 表示
文字列"ABCDE" {{ text }} ABCDE
数字 1234.5678 {{ number }} 1234.5678
リスト ['A','B'] {{ list.0 }}{{ list.1 }} AB
タプル ('A','B') {{ tapple.0 }}{{ tapple.1 }} AB
辞書 dic ={'A': 'B', 'C': 'D'} {{ dic.A }}{{ dic.C }} BD
辞書 dic2 ={'キー1': '値1', 'キー2': '値2'} {{ dic.キー1 }}{{ dic.キー2 }} 値1値2
ドット参照する際の検索順序に注意

ここで注意しないといけないのは、ドット(.)を見つけた時の検索順序です。

以下の順序

  1. 辞書検索
  2. 属性やメソッドの検索
  3. 数値のインデックス検索

なので。

もし辞書の中で 'items' という名前のキーがあると、forループの中でdic.items として「 dic.items()」を期待しても、dic['items'] の値が出力されてしまいます。

だから。

テンプレート内で辞書のメソッドを使いたい場合、メソッド名とダブる名前のキー (items、values、keys など) を辞書に追加しないようにしないといけません。

Djangoテンプレートのフィルタ 

djangoテンプレートは、autoescaping =オンがデフォルト(つまり、安全優先)なので、特に指定しないと

  • <を "&lt;" に変換
  • > を "&gt;" に変換
  • "'" (クオート) を ''' に変換
  • '"' (二重クオート)を '&quot;' に変換
  • "&" を "&amp;" に変換

が自動的に行われます。

まあ。

Python側で整形した文字列にして表示すれば良いのですけどね。

たま・・に、テンプレート側でなんとかしたい時があります。

例えば、自分の場合なら。

  • この変数の値だけはエスケープさせたくない
  • 少数の値をそのまま渡して、表示時に桁あわせしたい
  • 長い文字列がはいってきてもテンプレート側で指定文字数で切って表示したい
  • 特殊文字「{」や「}」などを、そのまま表示したい。

などです。

わりとよくあるパターンでもあるので、そのやり方だけ、ピックアップしておきます。

1.この変数の値だけはエスケープさせたくない 

safeをつかいます。

フィルターは「|」で接続できるので、文字列が変数「var」にあるときは、{{ var|safe }} みたいに使います。

こうすると、指定した部分だ自動エスケープしないで表示できます。

autoescapeをOFFにしてしまうのはセキュリティ的にリスクがあるので、必要な箇所にピンポイントで「safe」を「|」でつないで指定してやるほうが良いと思います。 

2.少数の値をそのまま渡して、表示時に桁あわせしたい 

floatformatを使います。

小数点以下のまるめ表示を指定できます。

小数数値が変数「var」にあるとき、{{ var|floatformat:3 }} とすると、小数点以下3桁でそろえて出力してくれます。

例えば・・

  • 34.23234 を「 {{ value|floatformat:3 }}」とすると出力は「 34.232」
  • 34.00000  を「{{ value|floatformat:3 }}」とすると出力は「 34.000」
  • 34.56000  を「{{ value|floatformat:3 }}」とすると出力は「 34.560」

です。

整数に丸めたい時は、、{{ var|floatformat:0 }}にするとできます。

  • 34.23234 を「 {{ value|floatformat:0 }}」とすると出力は「 34」
  • 34.00000  を「{{ value|floatformat:0 }}」とすると出力は「 34」
  • 34.56000  を「{{ value|floatformat:0 }}」とすると出力は「 35」

です。

小数点以下第一位を四捨五入します。 

3. 長い文字列を指定文字数で切って表示したい 

truncatecharsを使います。 

長い文字列を指定文字数でカットして、後ろに「...」を自動的につけてくれます。

HTML出力で文字列の長さをそろえたいとか地味に便利です。

例えば。

views.py内で、以下のような文字列をセット。

kanji = '君の行く道は果てしなく遠い。' 

 それをkanji1という名前でdjangoテンプレートに渡すとします。

'kanji1': kanji

 だけど、テンプレート側では10文字を超える文字列はカットして表示したいような場合に以下のようにすると。

{{ kanji1|truncatechars:10 }}

 表示は。

君の行く道は果てし…

 になります。 

4.特殊文字「{」や「}」などを、そのまま表示したい 

templatetagを使います。 

 djangoテンプレートにはエスケープの概念がないので、djangoテンプレート内で特殊な意味を持つ文字をHTMLで出力するときには、これを使うしかないです。

以下の特殊文字の出力に使います。

  • {% templatetag openblock %} → {%
  • {% templatetag closeblock %} → %}
  • {% templatetag openvariable %} → {{
  • {% templatetag closevariable %} → }}
  • {% templatetag openbrace %} → {
  • {% templatetag closebrace%} → }
  • {% templatetag opencomment %} → {#
  • {% templatetag closecomment%} → #}

必要になる時は滅多になく、自分も1回しかないですが、必要になった時に最初わからからなくてハマった(笑 経験談)ので、あげておきます。 

5.それ以外のフィルタ を調べるときのリンク情報

とりあえず、自分が使うものだけあげましたが、他にもStr.join()みたいな連結とか、日付のフォーマットとか、大文字・小文字変換とか、機能としては沢山あります。

テンプレート側でやりたいことがでてくれば、こちらを探すといいです。

docs.djangoproject.com

docs.djangoproject.com

 

おまけ:日本語ドキュメントのリンク

素晴らしい日本語ドキュメントもあります。

docs.djangoproject.com

 

ではでは。