建立分层注释树?

时间:2018-08-08 12:01:17

标签: python

我正在尝试在我的django项目中实现线程化注释,我希望这样: 数据

<script src="https://cdn.test.com/bundle-1.0.1-min.js/"></script>

例如

comment_list = [
    {'id': 1, 'content': '...', 'pid': None, 'children_comments': []},
    {'id': 2, 'content': '...', 'pid': None, 'children_comments': []},
    {'id': 3, 'content': '...', 'pid': 1, 'children_comments': []},
    {'id': 4, 'content': '...', 'pid': 3, 'children_comments': []},
    {'id': 5, 'content': '...', 'pid': 4, 'children_comments': []},
    {'id': 6, 'content': '...', 'pid': 2, 'children_comments': []},
    {'id': 7, 'content': '...', 'pid': None, 'children_comments': []},
    {'id': 8, 'content': '...', 'pid': 7, 'children_comments': []},
    {'id': 9, 'content': '...', 'pid': None, 'children_comments': []},
    {'id': 10, 'content': '...', 'pid': 9, 'children_comments': []},
]

我的代码:

1
 3
  4
   5

2
 6

7
 8

9
 10

我认为那不是很好

django jinjia中的决赛如何显示?

1 个答案:

答案 0 :(得分:3)

好的。

算法如下:

  • 遍历评论的平坦列表,将其父母的评论收集到comments_by_parent映射中
  • 再次遍历列表,从children_comments映射中分配comments_by_parent
  • 获取根级别的评论

from collections import defaultdict

comment_list = [
    {'id': 1, 'content': '...', 'pid': None},
    {'id': 2, 'content': '...', 'pid': None},
    {'id': 3, 'content': '...', 'pid': 1},
    {'id': 4, 'content': '...', 'pid': 3},
    {'id': 5, 'content': '...', 'pid': 4},
    {'id': 6, 'content': '...', 'pid': 2},
    {'id': 7, 'content': '...', 'pid': None},
    {'id': 8, 'content': '...', 'pid': 7},
    {'id': 9, 'content': '...', 'pid': None},
    {'id': 10, 'content': '...', 'pid': 9},
]

comments_by_parent = defaultdict(list)
for comment in comment_list:
    comments_by_parent[comment['pid']].append(comment)

for comment in comment_list:
    comment['children_comments'] = comments_by_parent[comment['id']]

root_comments = comments_by_parent[None]

root_comments最终看起来像这样(为清晰起见,JSON输出)。

[
  {
    "id": 1,
    "content": "...",
    "pid": null,
    "children_comments": [
      {
        "id": 3,
        "content": "...",
        "pid": 1,
        "children_comments": [
          {
            "id": 4,
            "content": "...",
            "pid": 3,
            "children_comments": [
              {
                "id": 5,
                "content": "...",
                "pid": 4,
                "children_comments": []
              }
            ]
          }
        ]
      }
    ]
  },
  {
    "id": 2,
    "content": "...",
    "pid": null,
    "children_comments": [
      {
        "id": 6,
        "content": "...",
        "pid": 2,
        "children_comments": []
      }
    ]
  },
  {
    "id": 7,
    "content": "...",
    "pid": null,
    "children_comments": [
      {
        "id": 8,
        "content": "...",
        "pid": 7,
        "children_comments": []
      }
    ]
  },
  {
    "id": 9,
    "content": "...",
    "pid": null,
    "children_comments": [
      {
        "id": 10,
        "content": "...",
        "pid": 9,
        "children_comments": []
      }
    ]
  }
]

然后您可以使用递归for循环在Jinja中输出此内容:

<ul>
    {%- for comment in root_comments recursive %}
        <li>
            {{ comment.content }}
            {%- if comment.children_comments -%}
                <ul>{{ loop(comment.children_comments) }}</ul>
            {%- endif %}
        </li>
    {%- endfor %}
</ul>