有更复杂的方法吗?

时间:2016-10-08 02:53:52

标签: python django recursion django-templates

我有以下代码:

{% if thing.parent.parent.parent.link %}
    <a href="/y/{{ thing.parent.parent.parent.link }}">{{ thing.parent.parent.parent.name }}</a>
{% endif %}

{% if thing.parent.parent.link %}
    <a href="/y/{{ thing.parent.parent.link }}">{{ thing.parent.parent.name }}</a>
{% endif %}

{% if thing.parent.link %}
    <a href="/y/{{ thing.parent.link }}">{{ thing.parent.name }}</a>
{% endif %}

这个非递归代码中发生变化的关键是简单地将.parent添加到链接/链接文本中。

我总共需要做20次这样的事情,正如你所看到的那样,重复和重复是相当丑陋的。使用django的模板框架是否有更加递归和更好的方式?

1 个答案:

答案 0 :(得分:2)

在您的上下文中返回一个列表,然后您可以使用迭代方法:

{% for parent in parents  %}
    <a href="/y/{{ parent.link }}">{{ parent.name }}</a>
{% endfor %}

因为如果它是一个孩子没有什么特别的(如你所提到的,唯一的区别是链接和名称),你可以将事物的父母转换成一个列表。在不了解您的数据结构的情况下,我无法给出一个确切的方法来做到这一点,但也许这会给你一个想法:

 parents = []

 for thing in things:
     node = thing
     while hasattr(node, 'parent'):
         parents.append(node.parent)
         node = node.parent
相关问题