Как вывести древовидную структуру в 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() работает как надо, а вот с тем, как сделать вывод на страницу статьи, у меня возникли проблемы - я даже не знаю, с чего начать. Сначала появилсь идея как-то использовать самописные теги для шаблонизатора, но до этого я сталкивался лишь с простыми тегами, которые просто возвращают значение, так что тут тоже не очень представляю, как сделать и через них

Вернуться на верх