当前位置:  开发笔记 > 编程语言 > 正文

如何使用django模板渲染树结构(递归)?

如何解决《如何使用django模板渲染树结构(递归)?》经验,为你挑选了7个好方法。

我在内存中有一个树结构,我想使用Django模板在HTML中呈现.

class Node():
  name = "node name"
  children = []

将有一些对象root是a Node,并且childrenNodes 的列表.root将在模板的内容中传递.

我已经找到了关于如何实现这一点的讨论,但是海报表明这在生产环境中可能并不好.

有人知道更好的方法吗?



1> Rohan..:

使用with模板标签,我可以做树/递归列表.

示例代码:

主模板:假设'all_root_elems'是一个或多个树根的列表

    {%for node in all_root_elems %} {%include "tree_view_template.html" %} {%endfor%}

tree_view_template.html呈现嵌套ul,li并使用node模板变量,如下所示:

  • {{node.name}} {%if node.has_childs %}
      {%for ch in node.all_childs %} {%with node=ch template_name="tree_view_template.html" %} {%include template_name%} {%endwith%} {%endfor%}
    {%endif%}

  • 虽然我确信没有充分的理由不按要求做,但这个答案实际上解决了这个问题.存在性能损失,但使用{%with%}将模板名称存储在变量中可防止django模板编译器无限递归.

    2> Anders Euren..:

    我认为规范的答案是:"不要".

    你可能应该做的是解开你的视图代码中的东西,所以这只是在模板中迭代(in | de)凹痕的问题.我想我会通过在列表中附加缩进和dedents来实现它,同时通过树递归然后将"travelogue"列表发送到模板.(然后模板将插入

  • 从该列表中创建具有"理解"它的递归结构.)

    我也很确定递归包含模板文件真的是一种错误的方法...


    当然.你创建一个像['in','in','blah','out','blah','out']的列表,然后你在模板中循环它.如果它等于'in'你发出一个li,'out'你发出一个/ li,否则你只是转储文本本身.
    我没有看到这可能如何保留原始数据的层次结构,除非您在视图中将整个事物渲染为HTML.你能提供一个更具体的例子吗?

    3> 小智..:

    这可能比你需要的更多,但是有一个名为'mptt'的django模块 - 它在sql数据库中存储一个分层树结构,并包含在视图代码中显示的模板.你可能会在那里找到有用的东西.

    这是链接:django-mptt



    4> 小智..:

    我来不及)所有的你用这么多的不必要的标签,这是我该怎么办recuesive:

    在主模板中:

    
    
      {% include "menu.html" %}

    然后在menu.html中:

    {% for menu in menu_list %}
        
  • {{ menu.name }} {% if menu.submenus|length %}
      {% include "menu.html" with menu_list=menu.submenus %}
    {% endif %}
  • {% endfor %}



    5> 小智..:

    是的,你可以做到.这是一个小技巧,将文件名作为变量传递给{%include%}:

    {% with template_name="file/to_include.html" %}
    {% include template_name %}
    {% endwith %}
    



    6> John..:

    对于这个确切的场景,Django有一个内置的模板助手:

    https://docs.djangoproject.com/en/dev/ref/templates/builtins/#unordered-list


    如果要输出的所有内容都是"
  • sometext ",则可以正常工作.如果您有更复杂项目的嵌套层次结构,并且您(例如)希望每个项目都是链接,则此标记无用.

    7> disc0dancer..:

    我有同样的问题,我写了一个模板标签.我知道还有其他像这样的标签,但我还是需要学习制作自定义标签:)我认为结果非常好.

    阅读docstring了解使用说明.

    github.com/skid/django-recurse

  • 推荐阅读
    kikokikolove
    这个屌丝很懒,什么也没留下!
    DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
    Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有