Вопрос Django {% if forloop.first%}
У меня есть следующий код в моем шаблоне:
{% for object in object_list %}
{% with game=object.game %}
{% for category in object.game.objectmeta.categories.all %}
{% if category.name|title == 'Puzzle' %}
{% if forloop.first %}
<div class='side_header' id='dark_gamelink_side'>
<a class='actionheader' href=""></a>
</div>
{% endif %}
<div class='game_link' id='dark_gamelink'>
<a class='img_link' href="{% url game_view game.id game.title|slugify %}">
<img class='game_img' src='{{game|thumb:"78x65"}}' alt='{{game.title}}' />
</a>
<div class='top_game_title' style='padding:0'>
<a style='position:relative; top:-3px' id='yellowlink' href="{% url game_view game.id game.title|slugify %}">{{game.title}} -- {{category.name|title}}</a>
<img style='position:relative; top:1px; margin-left:12px' src='thumbsup.gif' width='17' height='18'/>
<span style='position:relative; top:-3px; font-size:10px; color:white'>99%</span>
</div>
{% if game.description|length > 65 %}
{{ game.description|slice:"65" }}...
{% else %}
{{ game.description }}
{% endif %}
</div>
{% if forloop.counter0 == 3 %}
<div class='more_games'><br/></div><div class='side_header' id='dark_gamelink_side'><a class='adventureheader' href=adventure.htm></a></div>
{% endif %}
{% endif %}
{%endfor%}
{% endwith %}
{% endfor %}
Теперь я использую это:
{% if forloop.first %}
<div class='side_header' id='dark_gamelink_side'>
<a class='actionheader' href=""></a>
</div>
{% endif %}
чтобы попытаться определить, является ли это первой итерацией цикла for, непосредственно предшествующей ей, а не родительским forloop. Другими словами, я пытаюсь определить, является ли это 1-й итерацией этого цикла for:
{% for category in object.game.objectmeta.categories.all %}
не этот:
{% for object in object_list %}
Теперь он не работает, потому что он отображает это:
<div class='side_header' id='dark_gamelink_side'>
<a class='actionheader' href=""></a>
</div>
Дважды. Как определить первую итерацию вложенного forloop?
Ответы
Ответ 1
Отредактировано:
Я никогда не использовал эти переменные, но я думаю, что forloop.parentloop.first
должен это сделать. Если не обвинять меня в неправильном понимании Django docs.; -)
Вы должны проверить, находитесь ли вы в родительской точке, а затем в первом вложенном node. Попробуйте этот модифицированный шаблон. Вы должны дать правильное направление.
{% if forloop.parentloop.first %}
I am in the first loop of the parent
{% else %}
{% if forloop.first %}
<div class='side_header' id='dark_gamelink_side'>
<a class='actionheader' href=""></a>
</div>
{% endif %}
{% endif %}
Ответ 2
Я думаю, что лучший способ решить это - не определить, является ли это первой итерацией в цикле, а скорее написать ваш HTML так, чтобы он был полностью вне цикла.
Вы должны писать только HTML-элементы в цикле for, которые вы действительно хотите повторять для каждой итерации. Если это не сработает, переосмыслите, как вы предоставляете данные вашему представлению (object_list, game, category и т.д.), Чтобы вы могли легче писать свою разметку.
Начало вашего представления, вероятно, будет выглядеть примерно так:
<div class='side_header' id='dark_gamelink_side'>
<a class='actionheader' href=""></a>
</div>
{% for object in object_list %}
{% with game=object.game %}
{% for category in object.game.objectmeta.categories.all %}
{% if category.name|title == 'Puzzle' %}