我有一个ForeignKey ='self'的模型,我想通过列表和子列表反映数据库中的所有数据:
这是我的模特:
class Place(models.Model)
name = models.CharField(max_length=128, verbose_name='Place name', )
slug = models.SlugField(max_length=128, blank=True, null=True)
parent = models.ForeignKey('self', on_delete=models.CASCADE, blank=True, null=True)
role = models.CharField(max_length=20, choices=ROLE_CHOICES, null=True, blank=True)
答案 0 :(得分:0)
Django模板并非旨在处理复杂的逻辑。例如, 您不能使用如下包含代码编写嵌套逻辑:
# foo.html {% if nodes|iterable %} <ul> {% for x in nodes %} {% include "foo.html" with nodes=x %} {% endfor %} </ul> {% else %} <li>{{ nodes }}</li> {% endif %}
因为Django模板节点在获得之前已被解析和编译 渲染,并且上面的代码的编译可能会陷入循环 并无法达到最大递归深度。
通常,模板标签就像{%nested nodes%}一样有效 就像一个视图,但属于Django模板的范围,仅此而已 需要。
此外,您可以通过过滤器将数据转换为单一数据, 然后轻松遍历它:
{% 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}
这类似于呈现mptt树或线程的想法 评论。