para realizar la operación de adición en forloop.counter en la plantilla de django

Quiero reducir el valor de forloop.counter en la plantilla de django para la condición dada, ¿es posible en django?

A continuación se demuestra el ejemplo

{% for i in item %}
    {% if forloop.counter0|divisibleby:4 %}
        Start
    {% endif %}
        {% if i %}
            item{{ forloop.counter }}
        {% else %}
            ######### Here I want to reduce value of forloop.counter by 1 ###########
        {% endif %}
    {% if forloop.counter|divisibleby:4 %}
        End
    {% endif %}

{% endfor %} 

En el código anterior para 8 elementos perfectos, la salida será

Start
item1
item2
item3
item4
End
Start
item5
item6
item7
item8
End

pero supongamos que item2 es Ninguno, entonces la salida es

Start
item1 
item3
item4
End
Start
item5
item6
item7
item8
End

Quiero imprimirlo en forma de orden ascendente adecuado (incrementado en 1 en cada paso) reduciendo el valor de forloop cada vez si no se cumple la condición. No sugiera sobre la etiqueta de plantilla personalizada, lo sé y lo considero como la última opción.

preguntado el 04 de julio de 12 a las 10:07

¿Has probado por add filtrar por tener parámetro -1? -

el valor de forloop.counter disminuirá en -1 usando add:-1. -

4 Respuestas

Realmente dudo que Django te deje meterte con forloop.counter así de fácil, y no me metería con eso de todos modos. La solución obvia sería filtrar su lista antes de iterar sobre ella, lo que se puede hacer en su vista o (si insiste en hacerlo en la plantilla) usando un filtro personalizado.

O puede envolver su lista en una función generadora que se encargará del filtrado y la numeración, es decir:

def filteriternum(seq):
    num = 0
    for item in seq:
        if not item:
            continue
        num += 1
        yield num, item

Aquí nuevamente, puede hacer el ajuste en su vista o escribir un filtro de plantilla personalizado de etiqueta que hará el ajuste.

Respondido 04 Jul 12, 11:07

Pensé en hacerlo de esa manera, pero iterar una lista larga hace dos iteraciones, ya sea que lo haga a la vista o en la plantilla usando el filtro: Paritosh Singh

@ParitoshSingh Luego envuelva su lista en un generador de filtrado (o renumeración): bruno desthuilliers

aunque no es 100% lo que quiero, pero siento que entre todas es la respuesta más apropiada. Gracias @bruno :) - Paritosh Singh

@ParitoshSingh gracias por aceptar mi respuesta. ¿Podría explicar por qué no se adapta "100%" a sus necesidades? Es posible que haya entendido mal o haya pasado por alto algo en su pregunta, pero no veo qué es exactamente... - bruno desthuilliers

no, su respuesta es perfecta, pero pensé que habría algún proceso en django para disminuir el valor de forloop.counter, pero creo que no existe un proceso tan seguro, por lo que su respuesta parece correcta. - Paritosh Singh

Quizás algo como esto:

{% for i in item %}
    {% cycle 'Start' '' '' '' %}
    {% if i %}
            item{{ forloop.counter }}
    {% else %}
            empty item{{ forloop.counter }}
    {% endif %}
    {% cycle '' '' '' 'End' %}
{% endfor %} 

Aquí está el resultado:

Start
item1 
empty item2 
item3
item4
End 
Start
item5 
item6 
item7 
item8
End 

ACTUALIZACIÓN: Encontré algo realmente divertido, cómo disminuir el forloop.counter usando una variable 'local':

{% cycle 0 -1 -2 -3 -4 -5 -6 -7 -8 -9 as dec %}

{% for i in item %}
    {% cycle 'Start' '' '' '' %}
    {% if i %}
        item{{ forloop.counter|add:dec }}
    {% else %}
        <!-- empty {% cycle dec %} here we move to the next decrementing value -->
    {% endif %}
    {% cycle '' '' '' 'End' %}
{% endfor %} 

Respondido 04 Jul 12, 12:07

Lo siento, no puedo entender cómo funciona exactamente el ciclo aquí y no obtienes 2 nuevamente, lo cual es un problema: Paritosh Singh

¿Cuál es la salida deseada? No estoy seguro de entender lo que quieres lograr. He actualizado la respuesta, compruébalo ahora. - tisho

no @Tisho, mira la pregunta actualizada, dice que el número debe incrementarse en 1. Ahora entendiste mi punto. - Paritosh Singh

Entonces necesita un segundo contador independiente... O eliminar los valores Ninguno de la lista antes de pasarlos a la plantilla. O para usar una etiqueta personalizada... Encontré una forma divertida de disminuir el forloop.counter, pero funcionará para elementos limitados :) - tisho

ok, finalmente en lugar de jugar con forloop.counter, adopté la técnica que me dijo @brunodesthuilliers. Creo que esa es la única manera. También publica su solución, puede ser que funcione para mí también :) - Paritosh Singh

Adaptado de la respuesta de Tisho:

{% for i in item %}
    {% if i %}
        {% cycle 'Start' '' '' '' %}
            item{% cycle 1 2 3 4 5 6 7 8 %}
        {% cycle '' '' '' 'End' %}
    {% endif %}
{% endfor %}

Eso daría como resultado:

Start
item1 
item2
item3 
item4 
End 
Start
item5
item6 
item7 
item8 
End

¡así que ya no hay agujeros! Pero esto solo funciona si tiene un número limitado de valores, ya que está obligado a escribirlos todos en el segundo cycle etiqueta usada...

Respondido 04 Jul 12, 11:07

si la plantilla de django no se puede cumplir, intente escribir una usted mismo, marque aquí etiqueta de plantilla personalizada de django

Respondido 04 Jul 12, 10:07

quiero saber si es posible en django, por supuesto, esa es la última opción para mí. - Paritosh Singh

Por favor, vea la pregunta de nuevo.. ! - Jindle yugal

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.