wiki:BlockInJinja2Template

Jinja2 で for ループの中でブロックを使いたいとき

20110111 ymasuda

Jinja2 で、 for ループの中にブロックを書きたいとき、ありますよね?

{# this is base template base.html #}

<table>
  {% for object in objects %}
  <tr>
    {% block subtemplate_should_override_this %}
    {% endblock %}
  </tr>
  {% endfor %}
</table>

ところが、このテンプレートを継承したブロック内でループ変数を参照すると、うまくいかないようです。

{% extends "base.html" %}

{% block subtemplate_should_override_this %}
<th>{{ object.id }}</th>
<td>{{ object.value1 }}</td>
...
{% endblock %}

object なんていう変数はないよ、と怒ります。うーん。

ドキュメントを調べると、  http://jinja.pocoo.org/templates/#block-nesting-and-scope が見つかりました。 scpoed を付けるのが正しいようです。

<table>
  {% for object in objects %}
  <tr>
    {% block subtemplate_should_override_this scoped %}
    {% endblock %}
  </tr>
  {% endfor %}
</table>