文件夹结构的“平面”字典中的分层无序列表

2024-06-16 10:45:44 发布

您现在位置:Python中文网/ 问答频道 /正文

在后端,我从一个API获取一个文件夹结构。我递归地遍历这个结构以获取所有文件夹。然后这些都存储在一个“平面”有序字典中。每个文件夹都与一些属性一起存储,以定义结构、父文件夹的id、子文件夹的数量以及它本身是否是子节点。在

现在从这个有序的dict开始,我试图用Genshi创建一个很好的层次结构视图,但是到目前为止,我得到的最远的是下面的模板。这只会产生两个级别,根级别和一个级别以下。任何更深的文件夹都将显示在第二层。在

我正在尝试这样做,而不必求助于在数据的初始解析上做大量的关系检查,以获得文件夹所处的级别等等。有人有什么好主意吗?在

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

Tags: pydiv文件夹ifbodyli级别ul
1条回答
网友
1楼 · 发布于 2024-06-16 10:45:44

正如我所说,您可以使用使用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字典,另一个是包含所有顶层节点id的root_nodes序列。它创建的结构与您链接到的代码有点不同,因为它包含父节点的<li>标记中的子节点列表。我不确定这对渲染是否有任何影响,但我觉得这样做最正确。在

相关问题 更多 >