文件夹结构的'flat'字典中的分层无序列表

时间:2014-05-18 22:01:36

标签: python dictionary turbogears2 ordereddictionary genshi

在后端,我从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>

1 个答案:

答案 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>标记中的子节点列表。我不确定这在渲染中是否有任何区别,但对我来说这样做是最正确的。