2023年2月13日月曜日

Jinja2で変数を動的に作成して参照する方法

Jinja2で変数を動的に作成して参照する方法

概要

テンプレート内で参照したい変数名を動的に生成しその変数名の値を参照する方法を紹介します
わざわざ配列に set しなして参照する必要はありません

環境

  • macOS 11.7.3
  • Python 3.10.2
  • jinja2 3.1.2

サンプルコード

  • vim app.py
from jinja2 import Environment, FileSystemLoader

env = Environment(loader=FileSystemLoader('.'))
template = env.get_template('test.tpl')
data = {
    'name': 'hawksnowlog',
    'items': ['blog', 'twitter', 'youtube'],
    'lang1': 'ruby',
    'lang2': 'python',
}
disp_text = template.render(data, data=data)
print(disp_text)
  • vim test.tpl
String
{{ name }}
{% for i in range(1, 3) -%}
* {{ data.get('lang'~i) }}
{% endfor %}

List
{% for item in items -%}
* {{ item }}
{% endfor %}

ポイント

  • render の際にキーワード引数としてのデータと位置引数としてのデータを渡します
    • キーワード引数として渡したデータはテンプレート内で data として参照できます
    • 位置引数として渡したデータはテンプレート内では key-value で展開され、key 名で値を参照できます
  • テンプレート内では動的変数を使って取得したい値はキーワード引数から参照します
    • その際に get メソッドを使いキーワードの引数のキーから取得します
    • キーの情報を動的に生成することで実現しています
    • 動的に生成するキーはチルダでつなぐことでキー情報というということを明示しています

できない方法

  • vim test.tpl
String
{{ name }}
{% for i in range(1, 3) -%}
* {{ lang~i }}
{% endfor %}

List
{% for item in items -%}
* {{ item }}
{% endfor %}

こんな感じで lang を直接参照しようとしても参照できないのでキーワード引数経由で参照しましょう

0 件のコメント:

コメントを投稿