Django {% if forloop.first%} вопрос - PullRequest
15 голосов
/ 30 мая 2011

У меня есть следующий код в моем шаблоне:

{% 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:

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

Дважды.Как обнаружить первую итерацию вложенного цикла?

Ответы [ 2 ]

18 голосов
/ 30 мая 2011

Отредактировано:

Я никогда не использовал эти переменные, но я думаю forloop.parentloop.first должен это сделать.Если нет, то вините меня в том, что я неправильно понял Django docs .; -)

Вы должны проверить, находитесь ли вы в родительском цикле, а затем в первом вложенном узле.Пожалуйста, попробуйте этот измененный шаблон.Если вы дадите правильное направление.

{% 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 %}
1 голос
/ 30 мая 2011

Я думаю, что лучший способ решить эту проблему - это не определить, является ли это первой итерацией в цикле, а скорее написать ваш HTML-код таким образом, чтобы он находился вне цикла полностью.

Вы должны толькозапись HTML-элементов в цикле for, которые вы на самом деле хотите повторять для каждой итерации.Если это не сработает, заново продумайте, как вы предоставляете данные для своего представления (список_объектов, игра, категория и т. Д.), Чтобы вам было проще писать разметку.

Возможно, начало вашего представлениявыглядеть примерно так:

<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' %}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...