解説したくない、保守なんて絶対にしたくない、というようなテンプレートになってしまったのでデータ構造を見直すべきです。
html
1{% for f in fir %}
2 {% with fir_index=forloop.counter %}
3 <h1>{{ f }}</h1>
4 {% for s in sec %}
5 {% with sec_index=forloop.counter %}
6 {% if fir_index == sec_index %}
7 {% for s_item in s %}
8 {% with s_inner_index=forloop.counter %}
9 <h2>{{ s_item }}</h2>
10 {% for t in third %}
11 {% with third_index=forloop.counter %}
12 {% if fir_index == third_index %}
13 {% for t_inner in t %}
14 {% with t_inner_index=forloop.counter %}
15 {% if s_inner_index == t_inner_index %}
16 {% for t_item in t_inner %}
17 <h3>{{ t_item }}</h3>
18 {% endfor %}
19 {% endif %}
20 {% endwith %}
21 {% endfor %}
22 {% endif %}
23 {% endwith %}
24 {% endfor %}
25 {% endwith %}
26 {% endfor %}
27 {% endif %}
28 {% endwith %}
29 {% endfor %}
30 {% endwith %}
31{% endfor %}
結果(spaceless)
html
1<h1>1</h1><h2>1111</h2><h3>1111-1</h3><h3>1111-2</h3><h2>1112</h2><h3>1112-1</h3><h3>1112-2</h3><h1>2</h1><h2>2111</h2><h3>2111-1</h3><h3>2111-2</h3><h2>2112</h2><h3>2112-1</h3><h3>2112-2</h3>
追記
https://stackoverflow.com/questions/2415865/iterating-through-two-lists-in-django-templates#answer-14857664
にあるzipフィルタを使って
html
1{% for fs, t in fir|zip:sec|zip:third %}
2 <h1>{{ fs.0 }}</h1>
3 {% for st in fs.1|zip:t %}
4 <h2>{{ st.0 }}</h2>
5 {% for t in st.1 %}
6 <h3>{{ t }}</h3>
7 {% endfor %}
8 {% endfor %}
9{% endfor %}
と短く書けましたが、これも解説したくない、強く保守したくない、と思ってしまったので、やはりデータ構造を見直すべきです。
追記
python
1@register.filter(name='get')
2def get_attr(a, b):
3 return a[b]
4
というカスタムフィルタを定義すると
html
1{% for f in fir %}
2 {% with fir_index=forloop.counter0 %}
3 <h1>{{ f }}</h1>
4 {% for s in sec|get:fir_index %}
5 {% with sec_index=forloop.counter0 %}
6 <h2>{{ s }}</h2>
7 {% for t in third|get:fir_index|get:sec_index %}
8 <h3>{{ t }}</h3>
9 {% endfor %}
10 {% endwith %}
11 {% endfor %}
12 {% endwith %}
13{% endfor %}
となりました。これなら後から理解できそう。
質問に書いてあるような、無味乾燥で意味を含まないデータからは判断できない、というのが正直なところです。
単純には
pyhton
1 hoge = {
2 'arr': [
3 [
4 "1",
5 [
6 ["1111", ['1111-1', '1111-2']],
7 ["1112", ['1112-1', '1112-2']]
8 ]
9 ],
10 [
11 "2",
12 [
13 ["2111", ['2111-1', '2111-2']],
14 ["2112", ['2112-1', '2112-2']]
15 ]
16 ]
17 ],
18 }
となっていれば
html
1{% for f, st in arr %}
2 <h1>{{ f }}</h1>
3 {% for s, t in st %}
4 <h2>{{ s }}</h2>
5 {% for t_item in t %}
6 <h3>{{ t_item }}</h3>
7 {% endfor %}
8 {% endfor %}
9{% endfor %}
と書けるでしょうし、
python
1 hoge = {
2 'dic': {
3 "1":
4 {
5 "1111": ['1111-1', '1111-2'],
6 "1112": ['1112-1', '1112-2'],
7 },
8 "2":
9 {
10 "2111": ['2111-1', '2111-2'],
11 "2112": ['2112-1', '2112-2'],
12 }
13 }
14 }
となっていれば
html
1{% for f, st in dic.items %}
2 <h1>{{ f }}</h1>
3 {% for s, t in st.items %}
4 <h2>{{ s }}</h2>
5 {% for t_item in t %}
6 <h3>{{ t_item }}</h3>
7 {% endfor %}
8 {% endfor %}
9{% endfor %}
と書けるでしょう。
後者で、辞書のキーになる部分に重複があり得るならこのようには書けないです。また、古いPythonを考慮するならOrderedDict
を使うべきです。
テンプレート側の書きやすさと見やすさ、Pythonコード側の書きやすさと見やすさのバランスを取っていく必要があるので、表示しようとしているデータの中身がどう作られるのかも明らかでないと判断しにくいですね。