"BOKU"のITな日常

還暦越えの文系システムエンジニアの”BOKU”は新しいことが大好きです。

djangoテンプレート/変数の値の参照の仕方が、Pythonと違う所があるので整理しておく。

リスト・タプル・辞書などの値を参照する書き方はPythondjangoテンプレートでの違いを、小数点以下の桁あわせ等よくあるパターンだけ、つまみ食い的にまとめます。

f:id:arakan_no_boku:20191230001930p:plain

 

はじめに

 

djangoのドキュメントは豊富です。

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

docs.djangoproject.com

だから。

これを読めば知りたいことは、ほぼ書いてありますが、ドキュメントが大量なので、さっと調べたいときに、若干、手間取ります。

ということで。

自分用に、さくっと参照したくなりそうなことを、つまみ食い的にまとめます。

あれこれ欲張ると結局探しにくくなるので、今回は、以下の2つにしぼります。

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

 

変数の参照方法

 

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

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

しかし、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テンプレートは、autoescaping =オンがデフォルト(つまり、安全優先)なので、特に指定しないと

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

が自動的に行われます。

まあ。

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

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

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

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

などです。

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

 

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

 

safeをつかいます。

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

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

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

 

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

 

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」

です。

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

 

 長い文字列がはいってきてもテンプレート側で指定文字数で切って表示したい

 

truncatecharsを使います。 

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

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

例えば。

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

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

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

'kanji1': kanji

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

{{ kanji1|truncatechars:10 }}

 表示は。

君の行く道は果てし…

 になります。

 

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

 

templatetagを使います。 

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

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

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

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

 

それ以外

 

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

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

docs.djangoproject.com

docs.djangoproject.com

とりあえず、「テンプレート内での変数の参照」については、こんなところで。

ではでは。