Django Template - 增加变量的值

时间:2011-12-28 18:06:16

标签: django django-templates

我的模板中有以下代码

{% set counter = 0 %}
{% for object in object_list %}
    {% if object.attr1 == list1.attr1 and object.attr2 = list2.attr2 %}
        <li><a href="{{ object.get_absolute_url }}"> Link {{counter++}} </a></li>
     {% endif %}
{% endfor %}

我使用此custom tag设置变量的值,我想要做的是仅在满足if循环时增加值。我知道{{counter++}}不起作用。但是,如何编写可以执行相同任务的自定义标记?

4 个答案:

答案 0 :(得分:26)

不鼓励更改Django模板中对象的状态。您应该咬紧牙关,事先计算条件并将额外状态传递给模板,这样您就可以简化模板逻辑。

顺便说一句,我并不是这方面的纯粹主义者,但我已经被Django模板的有目的限制所困扰了几次。在我看来,你最好不要反对它。

由于您的意图似乎是过滤掉不匹配的项目,另一种方法是过滤掉视图中的项目,然后使用{{ forloop.counter }}来整理您想要的链接文本。所以在视图中你有这样的东西:

new_lst = filter(lambda x: x.attr0 == attr0 and x.attr1 == attr1, lst)

然后,在你的模板中:

{% for object in new_lst %}
   <li><a href="{{ object.get_absolute_url }}"> Link {{ forloop.counter }} </a></li>
{% endfor %}

答案 1 :(得分:12)

虽然这已经得到了回答并且违背了所说的内容,但我只是想了一下,如果你做了像

这样简单的反击类,就不会看到太大的伤害
class Counter:
    count = 0

    def increment(self):
        self.count += 1
        return ''

    def decrement(self):
        self.count -= 1
        return ''

    def double(self):
        self.count *= 2
        return ''

然后在您的模板中{{ counter.increment }} {{ counter.count }}

答案 2 :(得分:1)

如果varint = 6,则结果为8

{{ varint|add:"2" }}

如果varint = 6,结果将为5

  {{ varint|add:"-1" }}

答案 3 :(得分:0)

我自己刚刚找到了答案。正如我所说,我使用的是this custom tag,它为变量赋值。实际做的是set为context中的变量赋值,所以我只是从上下文中检索了值并递增了它。

这是代码

class IncrementVarNode(template.Node):

    def __init__(self, var_name):
        self.var_name = var_name

    def render(self,context):
        value = context[self.var_name]
        context[self.var_name] = value + 1
        return u""

def increment_var(parser, token):

    parts = token.split_contents()
    if len(parts) < 2:
        raise template.TemplateSyntaxError("'increment' tag must be of the form:  {% increment <var_name> %}")
    return IncrementVarNode(parts[1])

register.tag('increment', increment_var)

可以像{% increment <var_name> %}一样使用它,但是此var_name应该已经设置为以前使用上面提到的自定义标记{% set <var_name> = <var_value> %}

的值