Вы правы, dictionary
не обновляется в рекурсивных вызовах, и цикл не может быть продолжен, поскольку ключи не найдены.
Временное решение этой проблемы - использование только переменных, назначенных в цикле for. В примере словаря это означает перебирать элементы словаря, а не только ключи:
from jinja2 import Template
template = Template("""
{%- for key, value in dictionary.items() recursive %}
<li>{{ key }}
{%- if value %}
Recursive {{ key }}, {{value}}
<ul>{{ loop(value.items())}}</ul>
{%- endif %}
</li>
{%- endfor %}
""")
print template.render(dictionary={'a': {'b': {'c': {}}}})
Вывод этого скрипта:
<li>a
Recursive a, {'b': {'c': {}}}
<ul>
<li>b
Recursive b, {'c': {}}
<ul>
<li>c
</li></ul>
</li></ul>
</li>
, где вы можете видеть, что рекурсия на ключе b
работает нормально, потому что key
и value
обновляются на каждой итерации цикла (я добавил сообщение "Значение рекурсивного ключа, значение" в шаблон, чтобы сделать это понятно).