我正在尝试生成类似于以下内容的列表:
<ul>
<li>Parent 1
<ul>
<li>Child 1</li>
<li>Child 2</li>
<li class="last">Child 3</li>
</ul>
</li>
<li>Parent 2
<ul>
<li>Child 1</li>
<li>Child 2</li>
<li class="last">Child 3</li>
</ul>
</li>
<li class="last">Parent 3
<ul>
<li>Child 1</li>
<li>Child 2</li>
<li class="last">Child 3</li>
</ul>
</li>
</ul>
我最初只是这样做:
<ul>
{% recursetree mytree %}
<li class="{% if not node.get_next_sibling %}last{% endif %}">
{{ node }}
{% if not node.is_leaf_node %}
<ul>
{{ children }}
</ul>
{% endif %}
</li>
</ul>
但是,对每个项目的调用node.get_next_sibling
都会导致额外的查询。显然,这并不理想。所以我尝试使用tree_info
andstructure.closed_levels
来确定最后一项:
{% for node,structure in mytree|tree_info %}
{% if structure.new_level %}<ul><li>{% else %}</li><li>{% endif %}
<li class="{% if structure.closed_levels|length > 0 %}last{% endif %}">
{{ node }}
{% for level in structure.closed_levels %}</li></ul>{% endfor %}
{% endfor %}
这很好用,除了最后一个根级别项目没有获得“最后一个”类,因为它structure.closed_levels
始终是一个空列表。(它真的只适用于子项目)。
我确定我不是第一个需要完成类似事情的人,所以我希望这里有人可能已经有了解决方案。