Django {% if forloop.first %} 问题

21 投票
2 回答
46887 浏览
提问于 2025-04-16 18:34

我在我的模板里有以下代码:

{% 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循环的第一次迭代:

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

两次。怎么才能检测到嵌套for循环的第一次迭代呢?

2 个回答

1

我觉得解决这个问题的最好方法不是去判断循环中的第一次迭代,而是把你的HTML写在循环外面。

在for循环中,你只应该写那些你确实想要在每次迭代中重复的HTML元素。如果这样做不行,那就要重新考虑一下你是如何把数据提供给视图的(比如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' %}
28

编辑:

我之前从来没有用过这些变量,但我觉得 forloop.parentloop.first 应该可以解决这个问题。如果不行,那就怪我对 Django 的 文档 理解错了。;-)

你应该检查一下自己是否在父循环里面,然后再看看是否在第一个嵌套节点里。请试试这个修改过的模板,它应该能给你正确的方向。

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

撰写回答