variable tutorial template examples custom python django django-templates

python - tutorial - import django template



Contador personalizado en la plantilla django (2)

¿Qué hay de pasar un objeto itertools.count a la plantilla?

Modelo:

<select class="selectpicker datatable-column-control" multiple> {% for q_group in question_groups %} <optgroup label="{{ q_group.name }}"> {% for q in q_group.questions %} <option value="{{ counter }}">{{ q.title }}</option> {% endfor %} </optgroup> {% endfor %} </select>

Ver:

import itertools import functools render(request, ''template.html'', { question_groups: ..., counter: functools.partial(next, itertools.count()), })

Tengo este código en una página de plantilla django

<select class="selectpicker datatable-column-control" multiple {% for q_group in question_groups %} <optgroup label="{{ q_group.name }}"> {% for q in q_group.questions %} <option value="{{ forloop.counter0 }}">{{ q.title }}</option> {% endfor %} </optgroup> {% endfor %}

Quiero un valor para cada etiqueta de opción que aumente en cada iteración. Si tengo 10 etiquetas de opción, entonces sus valores serán de 0 a 9. forloop.counter0 no satisface mis necesidades ya que el contador de ciclo interno se inicializa a 0 cuando el ciclo externo finaliza una vez.


Reanimando esta publicación para proporcionar soluciones usando solo el lenguaje de plantilla.

Si sabe que solo tiene un {% for %} entre el contador (como en el ejemplo anterior), use forloop.parentloop . Puede encadenar muchos de estos juntos, pero debe conocerse el número de bucles que separan el bucle deseado, y usarlo resulta menos conveniente después de unos pocos ( forloop.parentloop.parentloop... ).

{% for foo in foos %} {% for bar in bars %} {# exactly one for loop between here #} {{ forloop.parentloop.counter0 }} is the index of foo. {% endfor %} {% endfor %}

Si tiene un número arbitrario de bucles for entre los dos (por ejemplo, en una plantilla que no puede controlar, o django-crispy-forms), guarde la variable de bucle con una instrucción with :

{% for foo in foos %} {% with foo_num=forloop.counter0 %} {% for bar in bars %} {# any number of for loops between #} {{ foo_num }} is the index of foo. {% endfor %} {% endwith %} {% endfor %}

La solución de Falsetru es la más adecuada para un contador que carece de un bucle for, o uno que sigue contando después de que uno ha terminado. Esta característica no es realmente posible solo con los comandos incorporados, por lo que las herramientas de iteración de la respuesta de falsetru son necesarias.

{% for foo in foos %} {{ counter }} is the index of foo {% endfor %} {% for bar in bars %} {{ counter }} is the index of bar + len(foos) {% endfor %}