Представлять дерево объектов в шаблоне Django
У меня есть модель Django, которая имеет ForeignKey для того же класса, эффективно создавая дерево:
class Tag(models.Model):
name = models.CharField(max_length=50)
parent = models.ForeignKey('self', blank=True, null=True)
Игра с рекурсивом в оболочке Django (./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. Я'мы создали собственный тег шаблона, чтобы сделать это проще, но я могуt понять, как передать данные в шаблон, чтобы легко перебирать дерево для отображения в шаблоне. Вот's основной тег шаблона.
@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()
функция называется. Но, как я уже сказал, я не знаю, как превратить это в единую структуру данных для передачи в мой шаблон.
Мысли? Я думаю, что я, вероятно, хочу построить своего рода диктат, яЯ просто не в состоянии пройти здесь.