Есть ли способ создать глобальную переменную счетчика в шаблонах django?

Я не вижу другого решения, кроме как создать глобальную переменную счетчик, этот счетчик будет затем проверяться, если он соответствует критериям (допустим, 9 элементов на страницу), тогда сделайте page break

Идеально, вот что я ожидаю сделать:

У меня fruit_items определяется следующим образом:

Class FruitVendor(Model):
    ....

@property
def fruit_items(self):
    return chain(
        self.appleitem_set.all(),
        self.bananaitem_set.all()
    )

Затем в шаблоне django я делаю следующее для списка:

{% for item in fruit_vendor.fruit_items %}
     {% if forloop.counter|divisibleby:9 %}
          <p style="page-break-before: always"></p>
     {% endif %}
   <table>
      {% for apple in appleitem_set.all() %} 
           <tr>
              <td>
                 {{apple.name}}
              </td>
           </tr>
      {% endfor %}
   </table>
<table>
     {% for banana in bananaitem_set.all() %} 
         <tr>
           <td>
               {{banana.name}}
           </td>
         </tr>
      {% endfor %}
 </table>
{% endfor %}

Как вы можете видеть выше, это приведет к разрыву страницы, но накладные циклы fruit_items генерируют несколько таблиц, что не предусмотрено.

Я думаю, что мне следует удалить цикл forloop в fruit_items и иметь глобальный счетчик, который добавляет + 1 в каждом цикле for, затем проверить, если глобальный счетчик кратен 9, то page-break, но я не уверен, что это возможно.

counter = 0

{% if counter|divisibleby:9 %}
          <p style="page-break-before: always"></p>
     {% endif %}
   <table>
      {% for apple in appleitem_set.all() %} 
           <tr>
              <td>
                 {{apple.name}}
              </td>
           </tr>
           counter += 1
      {% endfor %}
   </table>
<table>
     {% for banana in bananaitem_set.all() %} 
         <tr>
           <td>
               {{banana.name}}
           </td>
         </tr>
       counter += 1
      {% endfor %}
 </table>

Вы можете установить себе счетчик с помощью небольшого кода на языке python:

class MyCount(object):
    def __init__(self):
    self.v = 0  # or 1 if you prefer it to start at 1
def bump(self):
    self.v += 1
    return ''

Передайте экземпляр в вашем контексте

 context['counter'] = MyCount()

Ваш шаблон

{% if counter.v|divisibleby:9 %}  

{{counter.bump}} will increase counter.v by one

 
Вернуться на верх