Как вывести древовидную структуру в Django
Есть модель комментариев:
class Comments(models.Model):
article = models.ForeignKey(
Articles,
on_delete=models.PROTECT,
verbose_name='Статья',
related_name='Comments'
)
reply_to = models.ForeignKey(
"self",
on_delete=models.PROTECT,
blank=True,
null=True,
default=None,
verbose_name='Ответ на',
related_name='Replies'
)
user = models.ForeignKey(
User,
on_delete=models.SET_NULL,
blank=True,
null=True,
verbose_name='Пользователь',
related_name='Comments'
)
comment = models.TextField()
comment_datetime = models.DateTimeField(
blank=True,
null=True
)
status = models.CharField(
max_length=24,
default='published'
)
objects = models.Manager()
def __str__(self):
return str(self.user) + ": " + str(self.article) + "[{}]".format(self.comment_datetime)
class Meta:
verbose_name = 'Комменатрий'
verbose_name_plural = 'Комментарии'
Написал функцию для получения комментариев к статье в древовидной структуре:
def getCommentsTree(src=Articles.objects.get(id=1)):
class Tree:
def __init__(self, elem):
self.body = elem
self.heirs = []
def __str__(self):
if isinstance(self.body, Comments):
print(self.body.comment)
elif isinstance(self.body, str):
print(self.body)
else:
print(self.body.__class__.__name__)
body = None
heirs = list()
def append(self, elem):
self.heirs.append(Tree(elem))
def recapp(self, elem):
if isinstance(elem, QuerySet):
for i in elem.all():
self.recapp(Tree(i))
elif isinstance(elem, Tree):
self.append(elem.body)
for i in elem.body.Replies.all():
self.heirs[-1].recapp(Tree(i))
else:
raise TypeError("Must be Tree or QuerySet")
def recprint(self, layer=0, show_root=True):
if show_root:
print("-" * layer, end='')
if isinstance(self.body, str):
print(self.body)
else:
print(self.body.comment)
else:
layer -= 1
for i in self.heirs:
i.recprint(layer + 1)
return Tree("ROOT").recapp(Comments.objects.filter(article=src, reply_to=None))
И вывод в консоль через recprint()
работает как надо, а вот с тем, как сделать вывод на страницу статьи, у меня возникли проблемы - я даже не знаю, с чего начать. Сначала появилсь идея как-то использовать самописные теги для шаблонизатора, но до этого я сталкивался лишь с простыми тегами, которые просто возвращают значение, так что тут тоже не очень представляю, как сделать и через них