如何在模板中显示递归数据?

时间:2019-05-01 09:54:34

标签: python html css django django-models

我有一个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) 

1 个答案:

答案 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树或线程的想法   评论。