Попробуйте массив значений loop.index
, где родительский индекс сохраняется перед каждым вызовом loop () и извлекается сразу после него. Чтобы изменить массив без рендеринга текста, включите операторы {% do ... %}
.
Пример:
template = """
{%- set idxs = [0] -%}
{%- for item in sitemap recursive %}
depth={{idxs|length}}. idx={{loop.index}}. pidx={{idxs[-1]}}. title={{item.title}}
{%- if item.children -%}
{%- do idxs.append(loop.index) -%}
{{ loop(item.children) }}
{%- do idxs.pop() -%}
{%- endif %}
{%- endfor %}
"""
class Node():
def __init__(self, title, children=[]):
self.title = title
self.children = children
sitemap = [
Node('a', [
Node('a_a', [
Node('a_a_a'),
]),
Node('a_b', [
Node('a_b_a', [
Node('a_b_a_0'),
]),
]),
]),
Node('b'),
]
env = jinja2.Environment(extensions=['jinja2.ext.do'])
print env.from_string(template).render(sitemap=sitemap)
Эта программа печатает:
depth=1. idx=1. pidx=0. title=a
depth=2. idx=1. pidx=1. title=a_a
depth=3. idx=1. pidx=1. title=a_a_a
depth=2. idx=2. pidx=1. title=a_b
depth=3. idx=1. pidx=2. title=a_b_a
depth=4. idx=1. pidx=1. title=a_b_a_0
depth=1. idx=2. pidx=0. title=b