django中的动态导航

时间:2011-02-21 03:18:55

标签: python django

我想构建一个动态导航菜单,该菜单将根据数据库自动填充,并将显示在每个页面上。例如,我有一个流派模型。在这个模型中有一个名为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中实现它。我有一个上下文处理器,但这只是将所有类型列为当前的一个平面下拉(我必须记住为每个视图添加它)。我不确定使用自定义标记或包含标记是否更好,或者如何为此示例执行此操作。

感谢。

1 个答案:

答案 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的模板标记,以便渲染这些树以获得一些想法。

如果您有任何问题,请与我们联系。