我只是完成实现此。我想要一个子导航树形结构,但我不想对递归模板做任何奇怪的事情。
我实现的解决方案非常简单:我只是在视图中递归(在我的情况下是泛型辅助函数),并将层次结构展平成一个简单的列表。然后,在我的模板中,我只是使用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