3

我对 django 模板相当陌生,并且有一种我不了解一些基础知识的印象。

我有一个元素列表,我需要根据前一个和下一个元素的条件来渲染列表中的一个元素(如果后面或前一个元素被隐藏,我需要将当前元素标记为边框元素) .

如何for在 Django 模板的循环中引用前面和后面的元素?

4

4 回答 4

11

您可以为and编写自定义模板过滤器nextprevious

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 %}   

但就像其他人所说的那样,可能有更多优雅的解决方案可以通过您的视图执行此操作

于 2012-04-09T19:44:44.453 回答
3

您不能使用内置模板标签严格执行此操作。您需要涉及一些 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 %}
于 2012-04-09T19:42:55.780 回答
1

您真的不应该将 Django 模板用于这种逻辑。你有你的意见来处理它。我会找出列表中的哪些元素是边框,并传入一个额外的参数,我可以使用一个简单的if语句在模板中处理该参数。例如:

{% for element,is_border in data.items %}
 {% if is_border %}
   do something
 {% endif %}
{% endfor %}

有很多类似的方法可以做到这一点。我只举了一个例子。

于 2012-04-09T19:42:07.183 回答
1

您可以创建一个外部标签来执行此操作,但是构建为轻量级的 django 模板系统在 for 循环中没有这样的功能。

于 2012-04-09T19:43:21.460 回答