2014-05-18 26 views
0

在後端,我從API獲取文件夾結構。我遞歸迭代這個結構來獲取所有文件夾。這些都存儲在一個'平'有序字典中。每個文件夾都存儲有一些屬性以定義結構,父文件夾的ID,子文件夾的數量以及本身是否是子節點。從'平'字典文件夾結構的層次無序列表

現在從這個有序的字典,我想用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> 
+0

你的數據節點是否有父 - >子鏈接,或只有子 - >父?使用前者,你可以定義一個遞歸模板函數來展開它們,但是如果你沒有一個簡單的方法來獲取所有父項的子項,那將會更困難。 – Blckknght

+0

在原始api中,xml結構實際上是嵌套的,所以我可以輕鬆地添加父級>子級鏈接。但我不確定在那之後如何繼續。你能詳細說明嗎? – Sartsj

+0

我會用'py:def'來定義一個輸出鏈接到一個節點的「宏」,然後,如果該節點有子節點,則創建一個嵌套列表並遞歸地調用它自己來呈現每個子節點。我的系統中沒有'genshi',所以我不能真正做出我知道會有效的答案,但希望這個建議足以讓您走上正確的道路。 – Blckknght

回答

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詞典其中的所有節點以及包含所有頂級節點ID的root_nodes序列。這樣創建的結構與您鏈接的代碼有點不同,因爲它包含父代的<li>標記中的子節點列表。我不確定這是否會在渲染中產生任何影響,但對我來說這樣做似乎是最正確的。

+0

太棒了,謝謝!這更好,效率更高,它顯示得更好,它也使我在後端更好地清理我的代碼:) 在你的解決方案中只有一個小的錯字,你在'py中聲明'node_ids' :def',但在'for'循環中使用'nodes_ids'。 – Sartsj

+0

我很高興它有幫助。我修復了'nodes_ids'錯字(在較早的代碼草案中,通過調用參數'nodes'來保留)。 – Blckknght

相關問題