0

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

1 回答 1

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>其父节点的标记中包含子节点列表。我不确定这是否对渲染有任何影响,但这样做对我来说似乎是最正确的。

于 2014-05-19T19:50:54.567 回答