我有一个 Django 模型,它具有同一个类的 ForeignKey,有效地制作了一棵树:
class Tag(models.Model):
name = models.CharField(max_length=50)
parent = models.ForeignKey('self', blank=True, null=True)
在 Django shell ( ./manage.py shell
) 中使用递归,我可以很容易地将树表示为纯文本:
def nodes(parent, level):
children = Tag.objects.filter(parent=parent)
for c in children:
spaces = ""
for i in xrange(0,level):
spaces+=" "
print "%s%s" % (spaces,c.name)
nodes(c.pk,level+1)
nodes(None,0)
我不确定的是如何将整个树放入 Django 模板中。我创建了一个自定义模板标记来简化此操作,但我不知道如何将数据传递给模板以轻松遍历树以在模板中显示。这是基本的模板标签。
@register.inclusion_tag("core/tags.html")
def render_tags(**kwargs):
tags = Tag.objects.all()
return {"tags":tags}
我知道以上是非常基本的,我只是不知道从哪里开始。我认为如果 Tag 类有一个函数来获取它的孩子可能会更容易,所以我也有这个类:
def children(self):
return Tag.objects.filter(parent=self.pk)
我self.pk
在那里使用,然后树的根是简单的rootTag=Tag()
,因为它没有 pk 因为它没有保存,所以rootTag.children()
会找到任何没有父标签的标签,然后这些标签中的任何一个都可以继续children()
调用它们的函数. 但就像我说的,我不知道如何将其转换为某种单一的数据结构以传递给我的模板。
想法?我想我可能想建立一种字典,我只是无法在这里完成。