Python 在Django模板中标记下n个元素

Python 在Django模板中标记下n个元素,python,django,templates,Python,Django,Templates,我试图找出当遇到特殊元素时,如何标记列表中接下来的n个元素 我有一个这样的数据结构 [ {"type": "normal1", "text": "some text 1"}, {"type": "special", "text": "some text 2", "length": 2}, {"type": "normal1", "text": "some text 3"}, {"type": "header", "text": "some text 4"},

我试图找出当遇到特殊元素时,如何标记列表中接下来的n个元素

我有一个这样的数据结构

[
    {"type": "normal1", "text": "some text 1"},
    {"type": "special", "text": "some text 2", "length": 2},
    {"type": "normal1", "text": "some text 3"},
    {"type": "header", "text": "some text 4"},
    {"type": "header", "text": "some text 5"},
]
<p class="normal1">some text 1</p>
<div class="special">
<h1>some text2</h1>
<p class="normal1">some text 3</p>
<h2 class="header">some text 4</h2>
</div>
<h2 class="header">some text 5</h2>
{% for line in line_list %}
    {% if line.type == "special" %}
        <h1>{{ line.text }}</h1>
    {% elif line.type == "header" %}
        <h2 class="{{ line.type }}">{{ line.text }}</h2>
    {% else %}
        <p class="{{ line.type }}">{{ line.text }}</p>
    {% endif %}
{% endfor %}
其中类型是混合的,每个特殊元素的长度参数是任意的。长度参数意味着特殊节点“拥有”接下来的n个元素。每个普通类型在格式上的差异非常重要。我想要的是这样的输出

[
    {"type": "normal1", "text": "some text 1"},
    {"type": "special", "text": "some text 2", "length": 2},
    {"type": "normal1", "text": "some text 3"},
    {"type": "header", "text": "some text 4"},
    {"type": "header", "text": "some text 5"},
]
<p class="normal1">some text 1</p>
<div class="special">
<h1>some text2</h1>
<p class="normal1">some text 3</p>
<h2 class="header">some text 4</h2>
</div>
<h2 class="header">some text 5</h2>
{% for line in line_list %}
    {% if line.type == "special" %}
        <h1>{{ line.text }}</h1>
    {% elif line.type == "header" %}
        <h2 class="{{ line.type }}">{{ line.text }}</h2>
    {% else %}
        <p class="{{ line.type }}">{{ line.text }}</p>
    {% endif %}
{% endfor %}

一些文本1

一些文本2

一些文本3

一些文本4 一些文本5
我想不出怎么把潜水艇弄进去。到目前为止,我的模板如下所示

[
    {"type": "normal1", "text": "some text 1"},
    {"type": "special", "text": "some text 2", "length": 2},
    {"type": "normal1", "text": "some text 3"},
    {"type": "header", "text": "some text 4"},
    {"type": "header", "text": "some text 5"},
]
<p class="normal1">some text 1</p>
<div class="special">
<h1>some text2</h1>
<p class="normal1">some text 3</p>
<h2 class="header">some text 4</h2>
</div>
<h2 class="header">some text 5</h2>
{% for line in line_list %}
    {% if line.type == "special" %}
        <h1>{{ line.text }}</h1>
    {% elif line.type == "header" %}
        <h2 class="{{ line.type }}">{{ line.text }}</h2>
    {% else %}
        <p class="{{ line.type }}">{{ line.text }}</p>
    {% endif %}
{% endfor %}
{行列表%中的行的%
{%if line.type==“特殊”%}
{{line.text}}
{%elif line.type==“头”%}
{{line.text}}
{%else%}

{{line.text}

{%endif%} {%endfor%}

如果需要,我可以更改我的数据结构,以便特殊元素包含一个包含它所拥有的普通元素的列表,但是,我要么复制代码来处理不同的元素,要么做递归模板——我已经读过了,这是一个很大的禁忌。

为了解决这个问题并继续下去,我最终违抗了我读过的建议,使用修改过的数据结构的递归模板。这样做时,可能会有几个性能问题。对于我的特定应用程序来说,这并不重要。我将在下面概述我最终得到了什么

新数据结构

[
    {"type": "normal1", "text": "some text 1"},
    {"type": "special", "text": "some text 2", "nodes": [
        {"type": "normal1", "text": "some text 3"},
        {"type": "header", "text": "some text 4"}
    ]},
    {"type": "header", "text": "some text 5"}
]
基本模板

{% with template_name="sub_template" %}
    {% include template_name %}
{% endwith %}
子模板

{% for line in line_list %}
    {% if line.type == "special" %}
        <div class="{{ line.type }}">
        <h1>{{ line.text }}</h1>
        {% with line_list=line.nodes %}
            {% include template_name %}
        {% endwith %}
        </div>
    {% elif line.type == "header" %}
        <h2 class="{{ line.type }}">{{ line.text }}</h2>
    {% else %}
        <p class="{{ line.type }}">{{ line.text }}</p>
    {% endif %}
{% endfor %}
{行列表%中的行的%
{%if line.type==“特殊”%}
{{line.text}}
{%with line_list=line.nodes%}
{%include template_name%}
{%endwith%}
{%elif line.type==“头”%}
{{line.text}}
{%else%}

{{line.text}

{%endif%} {%endfor%}
很好地解释了你想要实现的目标,
+1
。。你的逻辑是无法实现的。为什么不尝试从views.py传递到上下文。。。