我想构建一个动态导航菜单,该菜单将根据数据库自动填充,并将显示在每个页面上。例如,我有一个流派模型。在这个模型中有一个名为parent的字段。如果这是null,则它是顶级类型。否则它拥有其他类型的id,并且是这种类型的子类型。它看起来像这样:
class Genre(models.Model):
name = models.CharField(max_length=100)
slug = models.SlugField(max_length=100)
parent = models.ForeignKey('self', null=True, blank=True)
def __str__(self):
return self.name
所以我有一个CSS下拉菜单,我想填充它,所以它是这样的:
类型 - >顶级类型列表。然后对于这些中的每一个,该类型的子类型的另一个下拉菜单。如果这是有道理的。
但我不知道如何在django中实现它。我有一个上下文处理器,但这只是将所有类型列为当前的一个平面下拉(我必须记住为每个视图添加它)。我不确定使用自定义标记或包含标记是否更好,或者如何为此示例执行此操作。
感谢。
答案 0 :(得分:3)
你在谈论创建一个hierarchy / tree,这对于处理来说相当烦人。
查看Modified Preorder Tree Traversal,这是一种处理树木的方法 它有一个django应用程序! http://django-mptt.github.com/django-mptt/
我强烈建议您使用它而不是自己动手。
这是一个关于入门的快速教程:比自己这样做容易得多。 http://komunitasweb.com/2010/09/a-quick-tutorial-on-django-mptt/
否则,如果你想支持无限深度,你需要一个遍历Genre
个孩子的递归函数。以下是Satchmo购物车的示例。基本上,您必须迭代每个顶级父级,递归迭代其子级,直到没有更多子级。
def _recurse_for_children(self, node, only_active=False):
children = []
children.append(node)
for child in node.child.active():
if child != self:
if (not only_active) or child.active_products().count() > 0:
children_list = self._recurse_for_children(child, only_active=only_active)
children.append(children_list)
return children
我强烈建议您查看satchmo的模板标记,以便渲染这些树以获得一些想法。
如果您有任何问题,请与我们联系。