Django: Подсчет forloop.first только при выполнении второго условия if

У меня есть следующий (слишком упрощенный пример):

{% for item in myitems  %}
  {% if item == "orange" %}
   {% if forloop.first %}
    {{item}}
  {% endif %}
 {% endif %}
{% endfor %}

Допустим, мой список myitems имеет вид ['apple','orange','watermelon']. Первый цикл будет item=apple, поэтому он не выведет элемент, потому что он не является "апельсином". Во втором цикле теперь item=orange but it no longer fulfills if forloop.first`, поэтому он не выведет элемент. Я хочу, чтобы forloop.first печатал только в том случае, если он выполнит условие попадания внутрь if orange. Как я могу этого добиться?

Если я правильно понял, вы в основном ищете этот кусок кода:

{% for item in myitems  %}
    {% if item == "orange" and forloop.first %}
        {{item}}
    {% endif %}
{% endfor %}

Простой and должен справиться с этой задачей. В примере, который вы привели ['apple','orange','watermelon'], отрисованный шаблон будет пустым.

Думаю, можно вывести элемент myitems только один раз при выполнении условия, используя переменную в шаблоне и изменяя ее значение при выполнении условия:

{% set stop_loop="" %}

{% for item in myitems  %}
    {% if stop_loop %}
    {% elif item == "orange" %}
        {{item}}
        {% set stop_loop="true" %}
    {% endif %}
{% endfor %}

IMO, такого рода бизнес-логика должна быть в представлении, а не в шаблоне.

Вот мое решение, основанное на предыдущих комментариях

{% with False as stop_loop %}
{% for item in myitems  %}
    {% if stop_loop %}
    {% elif item == "orange" %}
        {{item}}
        {% update_variable True as stop_loop %}
    {% endif %}
{% endfor %}
{% endwith %}

Мне нужно зарегистрироваться в templatetags следующем:

@register.simple_tag
def update_variable(value):
    return value
Вернуться на верх