読者です 読者をやめる 読者になる 読者になる

日記

日々のことと、Python/Django/PHP/Laravel/nodejs などソフトウェア開発のことを書き綴ります

Templateでのシンタックス

Python Django

ViewからTemplateに値を渡して表示する方法がわかったら、次はその渡された値からHTMLを切り替えたり、列挙された値の取り出しをしてみます。

まずは views.py を編集します。今回は色々な値を設定します。

# vim:fileencoding=utf-8
from django.shortcuts import render_to_response

def first(request):
    from datetime import datetime
    
    return render_to_response('first.html', {
      'abc': u'abcですと!',
      'none_data': None,
      'empty_string': '',
      'two_value': 2,
      })

マルチバイト文字列が入っているので、ファイル保存時にUTF-8にすること。
それと、先頭にファイルの文字コードを示すコメントが入っている点に注意してください。

続いて、first.htmlを書き換えます。

<html>
<head>
</head>
<body>
<p>サンプルアプリケーション はじめの一歩</p>

{% if none_data %}
  <p>None値はこっちには入らない。</p>
{% else %}
  <p>none_dataは Noneです</p>
{% endif %}

{% if emtpy_data %}
  <p>empty_data は空文字列なのでこっちに入ります。</p>
{% else %}
  <p>empty_data はこっちに入ります。</p>
{% endif %}

<p>
{% for ch in abc %}
  <span>{{ ch }}</span>
{% endfor %}
</p>

{% ifequal two_value 2 %}
<p>two_value は 2 なので表示される。</p>
{% endifequal %}

{% ifnotequal two_value 1 %}
<p>two_value は 1 ではないので表示される。</p>
{% endifnotequal %}

</body>
</html>

ブラウザでアクセスするとHTMLは以下のようになります。
(余分な改行を一部けずっています。)

<html>
<head>
</head>
<body>
<p>サンプルアプリケーション はじめの一歩</p>

  <p>none_dataは Noneです</p>

  <p>empty_data はこっちに入ります。</p>

<p>
  <span>a</span>
  <span>b</span>
  <span>c</span>
  <span>で</span>
  <span>す</span>
  <span>と</span>
  <span>!</span>
</p>

<p>two_value は 2 なので表示される。</p>

<p>two_value は 1 ではないので表示される。</p>
</body>
</html>

DjangoのTemplateでは、シンタックスというか制御文が入るところには、{% %}というタグを使用します。forで値を取り出すときも、Pythonのfor文に近い形で実装がされているため、"abcですと!"という部分は簡単に1文字ずつ処理できます。
その反面、凄く不便に感じるのが if の制御で比較演算子が一切使用できないことです。== はもちろん > とか < など全く使用できません。その代わりにサンプルコードでも使用している ifequal ifnotequal がありますが、細かい制御は Templateファイルがひたすら複雑になったりします。
Djangoでは、極力 Viewで表示用の処理を済ませてしまったり、Model側に表示用の関数を持たせることで、Templateに複雑なロジックを入れないのが良いと思います。ちなみに Templateでも引数無しの関数であれば、呼び出すことは可能です。
Templateで使用できる if や for は、組み込みタグとして分類されています。詳しくは Djangoのリファレンスを参照してください。(日本語訳は、1.0のマニュアルなので少し古いですが。。。)

次は、フィルターを使って表示する値をごにょごにょしてみたいと思います。