前回の続きで今回はマクロについて学習します。railsライクなWebフレームワークにはhelperと呼ばれるhtmlの定型文を出力機能がありますが、jinja2のマクロを使用するとそのhelperのような定型文出力の自動化処理を自作することができます。
マクロ
jinja2のマクロとは、よく使用されるイディオムを関数として再利用可能な形にしたものです。テンプレートファイルのmacroブロックに関数形式、つまり関数名と引数を記述します。公式のサンプルがわかりやすいため、そのまま引用します。inputタグを自動で組み立ててくれるマクロです。
テンプレートファイルを以下のように記述します。
{% macro input(name, value='', type='text', size=20) -%} <input type="{{ type }}" name="{{ name }}" value="{{ value|e }}" size="{{ size }}"> {%- endmacro %} <p>{{ input('username') }}</p> <p>{{ input('password', type='password') }}</p>
呼び出し側のpythonは以下のように記述します。
from jinja2 import Template, Environment, FileSystemLoader env = Environment(loader=FileSystemLoader('.'), trim_blocks=False) template = env.get_template('sample2.tpl') disp_text = template.render() print(disp_text)
上のコードを実行すると、以下のように出力されます。inputタグが自動で組み立てられることが確認できます。
<p><input type="text" name="username" value="" size="20"></p> <p><input type="password" name="password" value="" size="20"></p>
インポート
さて、非常に便利なマクロですが、さらにそれらを外出しにしてインポートを使用すると他のテンプレートファイルでも定義したマクロを呼び出すことが可能です。マクロを使う場合は必ずこちらも合わせて使用したほうがよいでしょう。先ほどのinputタグを組み立ててくれるマクロ部分だけをinputhelper.tplという名前で保存します。これを別のテンプレートファイルから呼び出すには、以下のように記述します。
{% import 'inputhelper.tpl' as helper %} <p>{{ helper.input('username') }}</p> <p>{{ helper.input('password', type='password') }}</p>
出力は先程と同様なので省略します。
フォームの部品などを毎回自力で書くのは大変ですが、一旦マクロを作れば次から他のプロジェクトでも使い回すことが可能なので、開発速度の向上や省力化につながります。是非活用してみてください。