wiki:BlockInJinja2Template

Version 1 (modified by ymasuda, 9 years ago) (diff)

--

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 なんていう変数はないよ、と怒ります。うーん。 もしかして、と思い、 with を使ってこんな風に書くと、うまくいきました。

<table>
  {% for object in objects %}
  <tr>
    {% with object=object %}{# ここが追加部分 #}
    {% block subtemplate_should_override_this %}
    {% endblock %}
    {% endwith %}{# ここも忘れずにね #}
  </tr>
  {% endfor %}
</table>

もしかして、 FAQ なのかな?