Python Django模板在嵌套列表上迭代
在Django中,我们如何迭代模板中的列表,例如Python Django模板在嵌套列表上迭代,python,django,django-templates,Python,Django,Django Templates,在Django中,我们如何迭代模板中的列表,例如[[1、[2、[3]]、[4、[]]、[2、[3]]] 请注意,以上只是一个随机的例子。列表中的每个元素都可以有任意数量的嵌套列表。我希望遍历其中的每一个值,并了解什么是父级,以便我们可以适当地设置HTML的样式 虽然有一种方法可以通过递归在视图本身中生成HTML并在模板中使用相应的变量,但这会使django模板和视图依赖,这是不需要的()。使用视图的一个例子是,模板系统本身中的表示比这种类型的实现要好。如上面的评论所述,是一种预先制作的解决方案,
[[1、[2、[3]]、[4、[]]、[2、[3]]]
请注意,以上只是一个随机的例子。列表中的每个元素都可以有任意数量的嵌套列表。我希望遍历其中的每一个值,并了解什么是父级,以便我们可以适当地设置HTML的样式
虽然有一种方法可以通过递归在视图本身中生成HTML并在模板中使用相应的变量,但这会使django模板和视图依赖,这是不需要的()。使用视图的一个例子是,模板系统本身中的表示比这种类型的实现要好。如上面的评论所述,是一种预先制作的解决方案,它应该非常适合您的问题 如果您想滚动自己的模板标记,可以查看django文档 一些提示:
-
通过创建无限嵌套的标记,您可能会遇到可用性问题,因为屏幕房地产是有限的,并且可能出于此原因考虑限制数据结构的深度。如果必须坚持使用数据结构,则可以根据级别数在模板中使用for循环
- 如果您更喜欢内置模板标记,那么最好使用嵌套字典列表(在顺序重要的地方包含列表),这也会更容易在模板中读取
- 一般来说,松耦合是很好的。但是,由于Django中视图的主要用途是为模板准备数据结构,因此不能将其完全解耦
例如,不能使用
include
这样的标记编写嵌套逻辑:
# foo.html
{% if nodes|iterable %}
<ul>
{% for x in nodes %}
{% include "foo.html" with nodes=x %}
{% endfor %}
</ul>
{% else %}
<li>{{ nodes }}</li>
{% endif %}
这类似于呈现mptt树或线程注释的想法 听起来你应该用。我同意伯翰的看法。不仅提供了树建模结构,还提供了非常方便的模板标记,以递归方式呈现部分模板。这是否意味着不接触数据库和应用程序而直接在模板中实现是不可能的,也是不可取的?
{% for x in nodes|nested_to_flat %}
{% if x.start_nodes %}<ul>{% endif %}
{% if x.end_nodes %}</ul>{% endif %}
{% if x.start_node %}<li>{% endif %}
{% if x.end_node %}</li>{% endif %}
{% if x.is_data %}{{ x.data }}{% endif %}
{% endfor %}
# nested_to_flat
@register.filter
def nested_to_flat(nodes):
if isinstance(nodes, list):
yield {'start_nodes': True}
for node in nodes:
yield {'start_node': True}
for i in nested_to_flat(node):
yield i
yield {'end_node': True}
yield {'end_nodes': True}
else:
yield {'data': nodes, 'is_data': True}