Skip to main content
 首页 » 编程设计

python之django 中的动态导航

2024年09月03日34pengyingh

我想构建一个动态导航菜单,它会根据数据库自动填充,并且会出现在每个页面上。例如,我有一个 Genre 模型。在这个模型中,有一个字段叫做 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 中实现它。我有一个上下文处理器,但目前它只是将所有类型列为一个平面下拉列表(我必须记住为每个 View 添加它)。我不确定使用自定义标签还是包含标签会更好,或者如何为这个例子做。

谢谢。

请您参考如下方法:

你说的是创建一个 hierarchy / tree ,处理起来相当烦人。

查看改进的预序树遍历,一种处理此类树的方法。
有一个 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 用于渲染这些树的模板标签以获得一些想法。

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