Джанго для цикла добавить переменные вместе

Я столкнулся с проблемой написания простого цикла for в шаблоне. Это то, что я пытаюсь написать в псевдокоде.

total = 0;
for each dividend
  total += dividend.amount;
  echo total;
endfor

Но я не могу понять, как написать строку += в файле шаблона django. Я понимаю, что, вероятно, я должен делать это в views.py, но почему-то я делаю это в шаблоне. Это мой код в файле detail.html:

{% with totalDividend=0.0 %}
{% for dividend in stock.dividend_set.all %}    
    [ {{ dividend.date|date:"U000" }} , {{ totalDividend|add:dividend.amount }} ],
{% endfor %}
{% endwith %}

но totalDividend|add:dividend.amount не работает, там нули. Как мне написать этот простой цикл for с добавлением в файл шаблона? В любом случае, я делаю цикл для дивиденда.Дата.


person Lucas03    schedule 18.04.2013    source источник


Ответы (1)


Вы можете написать тег шаблона, чтобы установить значение контекста:

from django.template.base import Library
register = Library()

@register.simple_tag(takes_context=True)
def set_by(context, k, v):
    context[k] = v
    return v

{# template #}    
{% with totalDividend=0.0 %}
{% for dividend in stock.dividend_set.all %}    
    [ {{ dividend.date|date:"U000" }} ,
      {% set_by 'totalDividend' totalDividend|add:dividend.amount %} ],
{% endfor %}
{% endwith %}

# OR
@register.assignment_tag(takes_context=True)
def setBy(context, k, v):
    context[k] = v
    return v

{% with totalDividend=0.0 %}
{% for dividend in stock.dividend_set.all %}    
    [ {{ dividend.date|date:"U000" }} ,
      {% set_by 'totalDividend' totalDividend|add:dividend.amount as totalDividend %}{{ totalDividend }} ],
{% endfor %}
{% endwith %}
person okm    schedule 18.04.2013
comment
Спасибо за ответ, через час проверю. Я читал о тегах, но думал, что что-то такое тривиальное можно сделать прямо в файле шаблона. Я действительно в шоке, что это не так. Спасибо еще раз. - person Lucas03; 18.04.2013
comment
Я пробовал обе ваши версии, но они не работают. Это мой файл detail.html [ссылка] (pastebin.com/xUQ7aTXy), и вот мой вывод. [ссылка] (46.28.109.22:8800/stocks/B). Цена (оранжевая линия) — это место, где я хочу добавить сумму. Это ноль (источник js). - person Lucas03; 19.04.2013
comment
Хм, это работает, просто не работает с числами с плавающей запятой. stackoverflow.com/questions/2237607/ - person Lucas03; 19.04.2013
comment
@ Lucas03 Понятно =) да, вам нужен еще один тег добавления. - person okm; 19.04.2013