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