見出し画像

Jinja2テンプレートでマクロ機能を使う

今日は、『つくってマスターPython』の6-3 “Jinja2テンプレートの活用”で学んだことをアウトプットします。

マクロ機能

決まった形式の表示をいくつも作成するような場合、それらの表示を自動化する機能が欲しくなりますが、これを行うのが「マクロ」です。マクロは、決まった表示を出力させるための関数のような働きをするものです。

マクロの定義

{% macro 名前 ( 引数 ) -%}
・・・・・表示内容・・・・・
{% -endmacro %}

マクロの適用

{{ 名前 ( 引数 ) }}
マクロの定義は、{% macro -%}に、マクロの名前と、()の引数として渡される値を用意します。この渡された値を使って表示を作成します。
作成されたマクロは、それ以降、{{}}記号を使って呼び出すことができます。これにより、{% macro -%}から{% -endmacro %}までに記述された内容が、マクロを呼び出した部分に出力されます。

「関数を定義した後、関数を呼び出して使用する」と同じ感覚でつかえばよさそうですね。

マクロを利用したテンプレート

{% extends "layout.html" %}

{% macro row(item) -%}
<tr>
 <td>{{item.id}}</td>
 <td>{{item.name}}</td>
 <td>{{item.mail}}</td>
</tr>
{%- endmacro %}

{% block content %}
<table>
 <tr>
   <th>ID</th>
   <th>NAME</th>
   <th>MAIL</th>
 </tr>
{% for item in data %}
 {{row(item)}}
{% endfor %}
</table>
{% endblock %}
ここでは、{% macro row(item) -%}というようにしてrowマクロを定義しています。引数として渡されるitemから表示する値を取り出して、テーブルの<tr>タグを作成しています。
このマクロは、{% for item in data}の繰り返し構文内で、{{row(item)}}として呼び出しています。繰り返しでdataから取り出されるitemをそのまま引数に指定してrowマクロを呼び出すと、itemの値をもとに<tr>タグが生成されます。

サポート、本当にありがとうございます。サポートしていただいた金額は、知的サイドハッスルとして取り組んでいる、個人研究の費用に充てさせていただきますね♪