我只是完成實現此。我想要一個子導航樹形結構,但我不想對遞歸模板做任何奇怪的事情。
我實現的解決方案非常簡單:我只是在視圖中遞歸(在我的情況下是泛型輔助函數),並將層次結構展平成一個簡單的列表。然後,在我的模板中,我只是使用for循環遍歷列表。
列表中的每個元素都可以是以下三種情況之一:「in」,對象或「out」。就我而言,我在視圖中構建了一系列ul li元素,所以當遇到「in」時,我創建了一個新的ul,當我遇到「out」時,我關閉了ul。否則,我呈現該項目。
我的模板代碼看起來是這樣的:
{% for item in sub_nav %}
{% if item == "in" %}
<ul>
{% else %}
{% if item == "out" %}
</ul>
</li>
{% else %}
<li>
<a href='{{item.full_url}}'>{{item.name}}</a>
{% if item.leaf %}
</li>
{% endif %}
{% endif %}
{% endif %}
{% endfor %}
在輔助函數的代碼如下所示:
def get_category_nav(request,categories=None):
"""Recursively build a list of product categories. The resulting list is meant to be iterated over in a view"""
if categories==None:
#get the root categories
categories = ProductCategory.objects.filter(parent=None)
categories[0].active=True
else:
yield 'in'
for category in categories:
yield category
subcats = ProductCategory.objects.select_related().filter(parent=category)
if len(subcats):
category.leaf=False
for x in get_category_nav(request,subcats):
yield x
else:
category.leaf=True
yield 'out'
使用這些片段,你應該能夠建立任何形式的分層樹你希望沒有在模板中做任何遞歸,並保持視圖中的所有邏輯。
我知道已經有一個可以接受的答案,但我想我會發布技術以防其他人幫助。
發生錯誤「調用Python對象時超出最大遞歸深度」,現在可以幫助我嗎? – Ahsan 2011-03-08 10:34:07
@Ahsan lemme看看 – DTing 2011-03-08 10:51:36
我認爲包括for循環創建問題,否則代碼是如此的好。 – Ahsan 2011-03-08 11:08:03