はじめに
Templateの印象といえば、「変数とfor文とif文が使えるHTMLファイル」という感じのいま、もうちょっと詳しくTemplateの事を知りたい。
こんなこともできた in Template
Templateの変数表示、for文, if文の実行以外のことを調べました。
Templateで生成できるフォーマット
HTML, XML, CSVも生成できるそうです。僕のような愚か者は勝手にHTMLだけだと決めつけていましたが、そうじゃないみたいです。
フィルタを使っていろいろできる
フィルタを使うことで変数をいじることができるそうです。{{ name| lower}}
とするとname
は小文字で表示できる。できるけど、Viewsでやったほうが良いんじゃないかな。変な混乱を生みそうだ。
フィルタを適用するときは決まって|
を使うそうです。{{ variable|filter|JJfilter }}
とすることでチェーンすることもできます。引数を取るフィルタもあります。{{ bio|truncatewords:30 }}.
truncatewords
は指定された数だけ文字を表示するフィルタ。この場合は最初の30文字だけを表示する。
default
フィルタを使うと変数の中身がFalseあるいは空のリストなどだった場合に表示するものを指定するこもできます。
{{ value|default:"nothing" }}
これを使えばif文が減らせそうですね。
このようなフィルタがDjangoには60個もあるそうです。お気に入りのフィルタを組み合わせ君の最強のTemplateを作り上げよう!
組み込みタグとフィルタ | Django documentation | Django
オブジェクトのメソッドを呼ぶ
Template内であっても、メソッドを呼び出すことができます。たとえば、外部キーで関連付けられたモデルにアクセスすることもできます。(easy_set
メソッド)
{% for comment in task.comment_set.all %} {{ comment }} {% endfor %}
もちろん自分で実装したメソッドも呼び出すことができます。しかし、引数を渡すことはできないそうです。Templateはあくまでも情報を表示することに徹しているべきだからです。ユーザがいじれるところで自由に引数を与えてメソッドを実行できるなんて恐ろしいですもんね。
その他
他の人が作ったカスタムタグや、カスタムフィルタを利用することもできるそうです。INSTALLED_APPS
に追加してTemplateで{% load custom_filter名 %}
とすることで導入できます。ぼくはまず、標準装備のカスタムタグ・フィルタをマスタしてからですね……
気になったタグ・フィルタ
今週の気になったタグ・フィルタのコーナー
タグ
firstof
与えられた引数からFalse
以外で一番最初の値を表示する。すべてFalse
なら何も表示しない。か、指定された文字を表示する。
{% firstof var1 var2 var3 "Here is fallback value"%} これは以下のテンプレートと等価です: {% if var1 %} {{ var1 }} {% elif var2 %} {{ var2 }} {% elif var3 %} {{ var3 }} {% endif %}
for ... empty
もし配列が空っぽなら〜〜を表示を簡潔に書けます。if文とはおさらばじゃ!
<ul> {% for athlete in athlete_list %} <li>{{ athlete.name }}</li> {% empty %} <li>Sorry, no athletes in this list.</li> {% endfor %} </ul>
lorem
loremもあった!知らなかった!
{% lorem 2 w random %}
with
変数値をキャッシュできる。DBを叩くような重いメソッドを何度も実行したくないときはこれを使いましょう。
{% with total=business.employees.count %} {{ total }} employee{{ total|pluralize }} {% endwith %}
フィルタ
date
引数で指定したフォーマットに日付を表示する。ありがたい。
{{ value|date:"D d M Y" }}
dictsort
引数で指定した要素でソートする。
{{ value|dictsort:"name" }}
timesince
Twitterとかのn分前が簡単にできる
{{ blog_date|timesince:comment_date }}
おわりに
なるほど、いろいろ便利そうなものがたくさんありました。日々精進ですな。でも、便利だからってTemplate内で値をいじりまくったりしたら、わけがわからなくなるので用法用量を守って使います。そして、なにげに今日でDjango記事マラソンが祝一週間だ。還暦まで続けたい。