我想构建一个动态导航菜单,它会根据数据库自动填充,并且会出现在每个页面上。例如,我有一个 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 用于渲染这些树的模板标签以获得一些想法。
如果您有任何问题,请告诉我。
