【发布时间】:2013-10-12 03:56:22
【问题描述】:
我有一个 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() 函数。但就像我说的,我不知道如何将其转换为某种单一的数据结构以传递给我的模板。
想法?我想我可能想建立一种字典,我只是无法在这里完成。
【问题讨论】:
-
为什么传递根目录还不够好?您仍然可以循环模板中的每个节点子节点。您可能只需要以某种方式重构您的 children 方法,这样它就不会每次都进行新的数据库调用。
-
有一个数据库调用这一事实并不重要,它需要递归,而不是迭代,AFAIK 并不是模板真正可以做到的。
-
啊。我现在明白你的问题了。 django-mptt (github.com/django-mptt/django-mptt) 有帮助吗?我自己从来没有用过,但我听说它对这种东西有好处
标签: python django templates tree