我对 django 模板相当陌生,并且有一种我不了解一些基础知识的印象。
我有一个元素列表,我需要根据前一个和下一个元素的条件来渲染列表中的一个元素(如果后面或前一个元素被隐藏,我需要将当前元素标记为边框元素) .
如何for
在 Django 模板的循环中引用前面和后面的元素?
我对 django 模板相当陌生,并且有一种我不了解一些基础知识的印象。
我有一个元素列表,我需要根据前一个和下一个元素的条件来渲染列表中的一个元素(如果后面或前一个元素被隐藏,我需要将当前元素标记为边框元素) .
如何for
在 Django 模板的循环中引用前面和后面的元素?
您可以为and编写自定义模板过滤器:next
previous
def next(value, arg):
try:
return value[int(arg)+1]
except:
return None
并在模板中:
{% for ... %}
{% with list|next:forloop.counter0 as next %}
{% if next.is_hidden %}
...
{% endif %}
{% endwith %}
{% endfor %}
但就像其他人所说的那样,可能有更多优雅的解决方案可以通过您的视图执行此操作
您不能使用内置模板标签严格执行此操作。您需要涉及一些 Python。
一种方法是zip
使用自身的列表:
new = ([(None, orig[0], orig[1])] +
zip(orig, orig[1:], orig[2:]) +
[(orig[-2], orig[-1], None)])
并将其传递给模板,然后像这样循环它:
{% for prev, current, next in new %}
{% if prev.hidden or next.hidden %}
BORDER
{% endif %}
{{ current }}
{% endfor %}
您真的不应该将 Django 模板用于这种逻辑。你有你的意见来处理它。我会找出列表中的哪些元素是边框,并传入一个额外的参数,我可以使用一个简单的if
语句在模板中处理该参数。例如:
{% for element,is_border in data.items %}
{% if is_border %}
do something
{% endif %}
{% endfor %}
有很多类似的方法可以做到这一点。我只举了一个例子。
您可以创建一个外部标签来执行此操作,但是构建为轻量级的 django 模板系统在 for 循环中没有这样的功能。