Django: iterar el número para el bucle de una plantilla

250

Tengo el siguiente bucle for en mi plantilla de django que muestra días. Me pregunto si es posible iterar un número (en el siguiente caso i) en un bucle. ¿O tengo que almacenarlo en la base de datos y luego consultarlo en forma de days.day_number?

{% for days in days_list %}
    <h2># Day {{ i }} - From {{ days.from_location }} to {{ days.to_location }}</h2>
{% endfor %}
orschiro
fuente

Respuestas:

594

Django lo proporciona. Puedes usar:

  • {{ forloop.counter }}El índice comienza en 1 .
  • {{ forloop.counter0 }}El índice comienza en 0 .

En plantilla, puedes hacer:

{% for item in item_list %}
    {{ forloop.counter }} # starting index 1
    {{ forloop.counter0 }} # starting index 0

    # do your stuff
{% endfor %}

Más información en: para | Etiquetas y filtros de plantilla incorporados | Documentación de Django

Rohan
fuente
1
Pero da longitud-1.
VIKAS KOHLI
2
¿Qué pasa con los bucles anidados? ¿Cómo podemos decirle a django si queremos contar el bucle interno o externo?
Tim Woocker
44
@ crey4fun, forloop.parentloopconsulte los documentos de referencia para obtener más información.
Rohan
91

También se puede usar esto:

{% if forloop.first %}

o

{% if forloop.last %}
JMJ
fuente
10
No es la respuesta a la pregunta, pero sigue siendo la respuesta para muchas personas que buscarán esta pregunta. ¡Buen material!
kontur
1

[La plantilla HTML de Django no admite el índice a partir de ahora], pero puede lograr el objetivo:

Si usa Dictionary dentro de Dictionary en views.py, entonces la iteración es posible usando la clave como índice. ejemplo:

{% for key, value in DictionartResult.items %} <!-- dictionartResult is a dictionary having key value pair-->
<tr align="center">
    <td  bgcolor="Blue"><a href={{value.ProjectName}}><b>{{value.ProjectName}}</b></a></td>
    <td> {{ value.atIndex0 }} </td>         <!-- atIndex0 is a key which will have its value , you can treat this key as index to resolve-->
    <td> {{ value.atIndex4 }} </td>
    <td> {{ value.atIndex2 }} </td>
</tr>
{% endfor %}

De lo contrario, si usa Lista dentro del diccionario, no solo se puede controlar la primera y la última iteración, sino que se puede controlar todo el índice. ejemplo:

{% for key, value in DictionaryResult.items %}
    <tr align="center">
    {% for project_data in value %}
        {% if  forloop.counter <= 13 %}  <!-- Here you can control the iteration-->
            {% if forloop.first %}
                <td bgcolor="Blue"><a href={{project_data}}><b> {{ project_data }} </b></a></td> <!-- it will always refer to project_data[0]-->
            {% else %}
                <td> {{ project_data }} </td> <!-- it will refer to all items in project_data[] except at index [0]-->
            {% endif %}
            {% endif %}
    {% endfor %}
    </tr>
{% endfor %}

Terminara si ;)

// Hope ha cubierto la solución con Dictionary, List, HTML template, For Loop, Inner loop, If Else. Documentación HTML de Django para más métodos: https://docs.djangoproject.com/en/2.2/ref/templates/builtins/

Mayur Raj
fuente