Я пытаюсь создать собственный тег шаблона, который будет увеличивать переменную.Это можно было бы использовать так:
{% for fruit in basket %}
{if fruit.is_apple %}{% count apples %}{% endif %}
{% endfor %}
<p>There are {{ apples }} apples in your basket</p>
Я придумал это:
#project/app/templatetags/counter.py
class CounterNode(template.Node):
def __init__(self, varname):
self.varname = varname
def render(self, context):
if self.varname in context:
context[self.varname] += 1
else:
context[self.varname] = 1
return ''
@register.tag
def counter(parser, token):
try:
tag_name, args = token.contents.split(None, 1)
except ValueError:
raise template.TemplateSyntaxError(
"'counter' node requires a variable name.")
return CounterNode(args)
Это прекрасно работает, пока вы не попытаетесь использовать тег счетчика в цикле for.Переменная count увеличивается внутри цикла, но сбрасывается в 1, когда переменная вызывается вне цикла.
Это связано с методом render () класса template.defaulttags.ForNode, который вызывает context.pop () в конце, но я не могу понять, почему это делается и как с этим можно справиться в моем пользовательском теге шаблона.
Итак, вопрос: как я могу получить свой счетчик теговувеличить даже на протяжении цикла?