我在内存中有一个树结构,我想使用Django模板在HTML中呈现.
class Node():
name = "node name"
children = []
Run Code Online (Sandbox Code Playgroud)
将有一些对象root是a Node,并且children是Nodes 的列表.root将在模板的内容中传递.
我已经找到了关于如何实现这一点的讨论,但是海报表明这在生产环境中可能并不好.
有人知道更好的方法吗?
Roh*_*han 69
使用with模板标签,我可以做树/递归列表.
示例代码:
主模板:假设'all_root_elems'是一个或多个树根的列表
<ul>
{%for node in all_root_elems %}
{%include "tree_view_template.html" %}
{%endfor%}
</ul>
Run Code Online (Sandbox Code Playgroud)
tree_view_template.html呈现嵌套ul,li并使用node模板变量,如下所示:
<li> {{node.name}}
{%if node.has_childs %}
<ul>
{%for ch in node.all_childs %}
{%with node=ch template_name="tree_view_template.html" %}
{%include template_name%}
{%endwith%}
{%endfor%}
</ul>
{%endif%}
</li>
Run Code Online (Sandbox Code Playgroud)
And*_*ius 28
我认为规范的答案是:"不要".
你可能应该做的是解开你的视图代码中的东西,所以这只是在模板中迭代(in | de)凹痕的问题.我想我会通过在列表中附加缩进和dedents来实现它,同时通过树递归然后将"travelogue"列表发送到模板.(然后模板将插入<li>并</li>从该列表中创建具有"理解"它的递归结构.)
我也很确定递归包含模板文件真的是一种错误的方法...
小智 20
这可能比你需要的更多,但是有一个名为'mptt'的django模块 - 它在sql数据库中存储一个分层树结构,并包含在视图代码中显示的模板.你可能会在那里找到有用的东西.
这是链接:django-mptt
Art*_*ult 18
我来不及)所有的你用这么多的不必要的与标签,这是我该怎么办recuesive:
在主模板中:
<!-- lets say that menu_list is already defined -->
<ul>
{% include "menu.html" %}
</ul>
Run Code Online (Sandbox Code Playgroud)
然后在menu.html中:
{% for menu in menu_list %}
<li>
{{ menu.name }}
{% if menu.submenus|length %}
<ul>
{% include "menu.html" with menu_list=menu.submenus %}
</ul>
{% endif %}
</li>
{% endfor %}
Run Code Online (Sandbox Code Playgroud)
Vla*_*mir 12
是的,你可以做到.这是一个小技巧,将文件名作为变量传递给{%include%}:
{% with template_name="file/to_include.html" %}
{% include template_name %}
{% endwith %}
Run Code Online (Sandbox Code Playgroud)
对于这个确切的场景,Django有一个内置的模板助手:
https://docs.djangoproject.com/en/dev/ref/templates/builtins/#unordered-list
我有同样的问题,我写了一个模板标签.我知道还有其他像这样的标签,但我还是需要学习制作自定义标签:)我认为结果非常好.
阅读docstring了解使用说明.
github.com/skid/django-recurse