在后端,我从API获取文件夹结构。我递归迭代这个结构来获取所有文件夹。然后将它们全部存储在一个“平面”中。有序字典。每个文件夹都存储有一些属性来定义结构,父文件夹的id,它具有的子文件夹的数量以及它本身是否是子节点。
现在从这个有序的词典中我试图用Genshi制作一个很好的分层视图,但到目前为止我得到的最远的是下面的模板。这导致只有2个级别,根级别和下面的一个级别。任何更深的文件夹都将显示在第二级。
我试图这样做,而不必诉诸于对数据的初始解析进行大量的关系检查,以获得文件夹所在的级别和东西。有没有人有任何聪明的想法?
<body>
<div class="main_content">
<h1>Catalogue Tree</h1>
<ul>
<li py:for="nodeId, nodeProps in nodes.iteritems()">
<a py:if="nodeProps['SubNode'] == False" href="${tg.url('/node/' + nodeId)}">${nodeProps['Name']}</a>
<py:if test="nodeProps['SubNode'] == True">
<ul>
<a href="${tg.url('/node/' + nodeId)}">${nodeProps['Name']}</a>
</ul>
</py:if>
</li>
</ul>
</div>
</body>
答案 0 :(得分:0)
正如我评论的那样,您可以使用py:def
指令创建的递归宏来解决您的问题。这是我尝试解决的问题(注意,我的系统上没有安装genshi
,所以这是未经测试的):
<ul py:def="display_nodes(node_ids)">
<li py:for="node_id in node_ids">
<a href="${tg.url('/node/' + node_id)}">${nodes[node_id]['Name']}</a>
<py:if test="nodes[node_id]['SubNodes']">
${display_nodes(nodes[node_id]['SubNodes'])}
</py:if>
</li>
</ul>
${display_nodes(root_nodes)}
模板的这一部分需要传递两个参数,一个nodes
字典,其中包含所有节点,以及root_nodes
序列,其中包含所有顶级节点的ID。它创建的结构与您链接的代码略有不同,因为它包含其父级<li>
标记中的子节点列表。我不确定这在渲染中是否有任何区别,但对我来说这样做是最正确的。