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

时间:2014-10-29 02:14:56

标签: 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"},
    {"type": "header", "text": "some text 5"},
]

其中类型是混合的,并且长度参数对于每个特殊元素是任意的。长度参数表示特殊节点"拥有"下一个 n 元素。非平凡的每种普通类型的格式差异。我想要的是像这样输出

<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>

我无法弄清楚如何在那里获得div。到目前为止,我的模板看起来像这样

{% 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 个答案:

答案 0 :(得分:0)

为了解决这个问题并继续使用它,我最终违反了我阅读的建议并使用具有修改数据结构的递归模板。以这种方式执行时可能会有几个性能命中。对我的特定应用而言,这并不重要。我将在下面概述我的最终结果。

新数据结构

[
    {"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"}
]

base_template

{% with template_name="sub_template" %}
    {% include template_name %}
{% endwith %}

sub_template

{% 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 %}