2011-05-29 11 views
13

que tiene el código siguiente en mi plantilla:Django {% if%} forloop.first pregunta

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

Ahora estoy usando esto:

{% if forloop.first %} 
    <div class='side_header' id='dark_gamelink_side'> 
     <a class='actionheader' href=""></a> 
    </div> 
{% endif %} 

para tratar de detectar si se trata de la primera iteración del bucle for inmediatamente anterior no el padre forloop. En otras palabras, estoy tratando de detectar si es la primera iteración de este bucle for:

{% for category in object.game.objectmeta.categories.all %} 
no

éste:

{% for object in object_list %} 

La forma en que está ahora no está funcionando porque es mostrar esta :

<div class='side_header' id='dark_gamelink_side'> 
    <a class='actionheader' href=""></a> 
</div> 

Dos veces. ¿Cómo detectar la primera iteración del forloop anidado?

Respuesta

15

Editado:

nunca he utilizado estas variables pero creo forloop.parentloop.first debe hacerlo. Si no me culpen por haber malinterpretado el Django docs. ;-)

Debe verificar si se encuentra dentro del parentloop y luego dentro del primer nodo anidado. Por favor prueba esta plantilla modificada. Deberías dar la dirección correcta.

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

sin que no lo hizo, acaba de cumplir la página en blanco. – Jim

+0

@Jim en mi opinión (he editado mi respuesta) al comprobar que 'parentloop' debería resolver su problema. – jazz

1

Creo que la mejor manera de resolver esto no es para detectar si esta es la primera iteración del bucle, sino más bien para escribir el código HTML de manera que es completamente fuera del bucle.

Solo debe escribir elementos HTML en el ciclo for que realmente desea repetir para cada iteración. Si eso no funciona, reconsidere cómo está proporcionando los datos a su vista (object_list, juego, categoría, etc.) para que pueda escribir su marcado más fácilmente.

El comienzo de la vista será probablemente algo parecido a esto:

<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' %} 
+0

por lo que no puedo hacer eso es porque más adelante usaré variables a las que solo se puede acceder desde ese segundo bucle for dentro del html que ahora es estático. – Jim