Templateについて少し調べる

はじめに

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記事マラソンが祝一週間だ。還暦まで続けたい。

参考リンク

組み込みタグとフィルタ | Django documentation | Django