我有以下代码:
{% 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的模板框架是否有更加递归和更好的方式?
答案 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