【问题标题】:render threaded comment tree in Jinja template在 Jinja 模板中渲染线程注释树
【发布时间】:2015-08-15 17:22:50
【问题描述】:

我正在尝试在我的烧瓶项目中实现线程化 cmets,我希望它看起来像这样:

comment1
    reply1
        reply4
            reply6
        reply5
    reply2
    reply3
comment2

对于上面的例子,我有这样的 cmets:

comments = { 'comment1':['reply1', 'reply2', 'reply3'],
             'reply1':['reply4', 'reply5'],
             'reply4':['reply6'],
             'reply2':[],
             'reply3':[],
             'reply5':[],
             'reply6':[],
             'comment2':[],
            }

键值对是comment:他们的直接回复

在此之后,我尝试为每个根评论(即评论 1、评论 2 等)构建一个基于列表的树,例如对于 comment1,我有一个像这样的树:

['reply1', ['reply4', ['reply6', []], 'reply5', []], 'reply2', [], 'reply3', []]

现在,我不知道如何将这些 cmets/回复呈现为线程和多级缩进。我应该如何在 Jinja 模板中解析这棵树并呈现 cmets/replies ?是否有必要像我在这里所做的那样为每个评论构建一个基于列表的树,或者 cmets 的字典是否足以满足所需的实现?

【问题讨论】:

  • 为什么不把 cmets 放在一个树形结构中(你可能需要自己写一些东西或者找一个库)。你的节点应该知道他们的深度。我建议不要在模板中添加太多逻辑...

标签: python tree jinja2


【解决方案1】:

首先决定 HTML 应该是什么样子(我假设你想生成 HTML),然后设计你的模板,然后编写 Python 代码来生成适当的数据结构。不要尝试在模板中实现任何复杂的树遍历。

嵌套 HTML 列表的一个示例:

<ul>
{% for node in nodes %}
{% if node.indent %}
  <li><ul>
{% elif node.outdent %}
  </ul></li>
{% elif node.content %}
  <li>{{ node.content }}</li>
{% endif %}
{% endfor %}
</ul>

这需要像这样的扁平树结构:

{ "nodes": [
  { "content": "hi" },
  { "indent": True },
  { "content": "how do you do" },
  { "outdent": True },
  { "content": "hi again" },
]}

【讨论】:

  • 发布此问题后,我尝试了与您的建议非常相似的方法,并且成功了。因此,我会接受你的回答。谢谢:)
猜你喜欢
  • 1970-01-01
  • 2011-08-20
  • 1970-01-01
  • 2017-07-20
  • 2023-04-07
  • 2015-04-13
  • 2015-11-24
  • 2020-06-28
  • 1970-01-01
相关资源
最近更新 更多