【问题标题】:Dynamic navigation in djangodjango中的动态导航
【发布时间】:2011-02-21 03:18:54
【问题描述】:

我想构建一个动态导航菜单,它会根据数据库自动填充,并且会出现在每个页面上。例如,我有一个流派模型。在此模型中,有一个称为 parent 的字段。如果为空,则为顶级流派。否则,它拥有其他流派的 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 中实现这一点。我有一个上下文处理器,但这只是将所有类型列为当前一个平面下拉列表(我必须记住为每个视图添加它)。我不确定使用自定义标签或包含标签是否会更好,或者在此示例中如何做到这一点。

谢谢。

【问题讨论】:

    标签: python django


    【解决方案1】:

    您正在谈论创建一个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 的模板标签来渲染这些树以获得一些想法。

    如果您有任何问题,请告诉我。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-26
    • 2013-03-08
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 2013-01-22
    相关资源
    最近更新 更多