Шаблон Django: получить общее количество итераций для вложенных циклов - PullRequest
4 голосов
/ 04 декабря 2010

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

Например:

Каждый цикл идет от 1 до 3 (включительно)

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

Дочерний цикл - третья итерация

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

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

Дочерний цикл - первая итерация

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

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

Ответы [ 4 ]

2 голосов
/ 04 декабря 2010

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

{% for ... %}
  {% for ... %}
    {% count totalloops %}
  {% endfor %}
{% endfor %}
{{ totalloops }}
1 голос
/ 22 сентября 2017

Либо вы можете использовать {{forloop.counter | add: forloop.parentcounter.counter}}, но в зависимости от ситуации, если вы хотите сбросить счетчик, вам нужно написать собственный метод 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" для увеличения или сброса его значения, например: -

<td id="subTopic" class="subTopic">
<p hidden value="{{ iterator_subtopic.res }}"></p>
{% 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 %}
                <input id="subTopic{{ iterator_subtopic.inc  }}" class="len"
                       value="{{ subtopic.name }}">
                <br>
            {% endfor %}
        {% endfor %}
    {% endfor %}
{% endfor %}

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

1 голос
/ 04 декабря 2010

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

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

{{forloop.counter | add: forloop.parentcounter.counter}} и т. д.

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

0 голосов
/ 15 мая 2019

С представлениями на основе классов (в частности, с использованием Python 3 и Django 2.1) и использованием ответа @ Javed в качестве отправной точки, в представлении вы можете сделать:

class Accumulator:

    def __init__(self, start=0):
        self.reset(start)

    def increment(self, step=1):
        step = 1 if not isinstance(step, int) else step
        self.count += step
        return self.count

    def reset(self, start=0):
        start = 0 if not isinstance(start, int) else start
        self.count = start
        return self.count

class MyView(ParentView):

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['counter'] = Accumulator()  # use start=-1 for a zero-based index.
        return context

тогда в шаблоне можно сделать:

{% with counter.increment as count %}
  <input id="form-input-{{ count }}">
{% endwith %}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...