Шаблон Django: получить общее количество итераций для вложенных циклов

У меня есть два вложенных цикла внутри шаблона. Мне нужно получить итоговые итерации, сделанные с момента запуска родительского цикла. Счетчик должен увеличиваться только тогда, когда дочерний элемент выполняет итерацию.

Например:

Каждый цикл идет от 1 до 3 (входит в комплект)

Родительский цикл - 1-я итерация

Детский цикл - 3-я итерация

Требуемый результат: 3

Родительский цикл - вторая итерация

Детский цикл - 1-я итерация

Требуемый результат: 4

Можно ли это сделать, используя стандартные теги шаблонов Django? Если нет, то каковы мои варианты?

3 ответа

Напишите тег шаблона count, который будет накапливаться в переменной контекста.

{% for ... %}
 {% for ... %}
 {% count totalloops %}
 {% endfor %}
{% endfor %}
{{ totalloops }}


Знаете ли вы, что происходит, сколько будет циклов?

Если это так, то простой способ:

{{forloop.counter | добавить: forloop.parentcounter.counter}} и т.д.

Немного вонючий по отношению к логическому разделению по логике (на этом фронте лучше понять предложение @Ignacio), но я считаю приемлемым, если он будет аккуратным и упорядоченным.


Либо вы можете использовать {{forloop.counter | add: forloop.parentcounter.counter}}, но в зависимости от ситуации, если вы хотите reset счетчик, тогда вам нужно написать свой собственный метод python, а позже вы можете назовите его из шаблона django.

Как и в ваших представлениях add-

class make_incrementor(object):
count = 0
def __init__(self, start):
 self.count = start
def inc(self, jump=1):
 self.count += jump
 return self.count
def res(self):
 self.count = 0
 return self.count
def EditSchemeDefinition(request, scheme_id):
iterator_subtopic = make_incrementor(0)
scheme_recs = scheme.objects.get(id=scheme_id)
view_val = {
 'iterator_subtopic': iterator_subtopic,
 "scheme_recs": scheme_recs,
}
return render(request, "edit.html", view_val)

Позже в вашем шаблоне django мы можем вызвать методы "iterator_subtopic" для увеличения или reset его значение, например: -

{% for strand in scheme_recs.stand_ids.all %}
 {{ iterator_subtopic.res }}
 {% for sub_strand in strand.sub_strand_ids.all %}
 {% for topic in sub_strand.topic_ids.all %}
 {% for subtopic in topic.sub_topic_ids.all %}
 
 
 {% endfor %}
 {% endfor %}
 {% endfor %}
{% endfor %}

Итак, он будет продолжать увеличивать значение, а также reset там, где мы хотим.

licensed under cc by-sa 3.0 with attribution.