Есть ли способ создать глобальную переменную счетчика в шаблонах 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