@Untiwe

Почему шаблон django игнорирует id в словаре?

Цель: сделать вывод комментариев с множественной врождённостью.
Для этого делается список для начальных комментариев (main_comments), выглядит примерно так
context['main_comments'] = [<Comments: 23>, <Comments: 24>]

И словарь дочерних комментариев(child_comments), где ключ, это id родительского комментария. выглядит примерно так
context['child_comments'] = {24: [<Comments: 22>, <Comments: 25>], 22: [<Comments: 26>]}

При выводе главного комментария подключится шаблон для вывода дочернего, и ставится переменная для что бы по ней обратиться к словарю. Выглядит это так
{% with perent_comment_id=comment.id %}
    {% include "post/child_comments.html" %}
{% endwith %}

А шаблоне проходимся по словарю циклом, обращаясь к словарю по ключу perent_comment_id
{%for comment in child_comments.perent_comment_id%}
    {# вывод каждого комментария #}

Но это не работает!
А теперь следим за руками:
{{perent_comment_id}} {# вывод родительского id: 24 #}
{{child_comments.24}} {# вывод дочерних комментариев: [<Comments: 22>, <Comments: 25>] #} 
{{child_comments.perent_comment_id}} {# не выводит ничего #}

Теперь вопрос, как так? и что делать?

P.S.
Приходится каждый раз перебирать словарь и сравнивать ключ с perent_comment_id. Это работает но оптимизация плохая
{%for key, comments in child_comments.items%}
    {% if key == perent_comment_id %}
        {%for comment in comments%
             {# вывод каждого комментария #}


P.S.S. Мне известно про django-mptt но я люблю делать велосипеды и разбираться в них
  • Вопрос задан
  • 83 просмотра
Решения вопроса 1
WStanley
@WStanley
Back-end Developer
1. Тебе надо чтобы твоя модель с комментариями имела ключ сама на себя
parent = models.ForeignKey("self")
2. Тебе надо во вью сформировать к примеру вот такой список с данными
ПС: это делается с помощью рекурсивной функции, гугли (как рекурсивно сформировать дерево, примерно)
ПС2: в список возможно также стоит включить parent_id и все что необходимо
comments = [{
    'id': 1,
    'text': 'asdaasd',
    'childrens': []
},
{    'id': 2,
    'text': 'asdaasd',
    'childrens': [
        {    'id': 7,
            'text': 'asdaasd',
            'childrens': [
                {    'id': 12,
                    'text': 'asdaasd',
                    'childrens': [
                        {    'id': 23,
                            'text': 'asdaasd',
                            'childrens': [],
                        },
                        ... # и т.д.
                    ],
                },
                ... # и т.д.
            ],
        },
        {    'id': 8,
            'text': 'asdaasd',
            'childrens': [],
        },
        ... # и т.д.
    ],
},
{    'id': 2,
    'text': 'asdaasd',
    'childrens': [
        {    'id': 15,
            'text': 'asdaasd',
            'childrens': [],
        },
        {    'id': 19,
            'text': 'asdaasd',
            'childrens': [],
        },
        ... # и т.д.
    ],
}
... # и т.д.
]

3. После этого выкинуть его в шаблон, и в шаблоне можно будет сделать так:
ПС: там где список childrens пустой значит нет комментариев-ответов
{%for comment in comments%}
    {{ comment.id }}
    {{ comment.text }}
    {% if comment.childrens %}
         # По идее здесь тоже надо будет организовать рекурсию, для отображения множественной вложенности
         # гугли - django template recursive tree, примерно
         # К вложенным комментариям вот так можно обращаться будет
        {% for children in comment.childrens  %}
             {{ children.id }}
             {{ children.text }}
             {% if children.childrens %}
                  # и т.д.
             {% endif %}
        {% endfor %}
    {% endif %}
{% endfor %}

Вот примерно так все это должно работать если использовать ссылку на себя
ПС: а вообще для работы с деревом грамотно использовать nested sets что и делается в django-mptt, но это уже совсем другая история :)
Удачного велосипедирования!
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы