在Django模板中乘以-1

时间:2013-04-02 18:48:37

标签: django django-templates

我想在Django模板中始终使用我的变量的正值。变量的符号只是一个文本含义:

{% if qty > 0 %}
  Please, sell {{ qty }} products.
{% elif qty < 0 %}
  Please, buy {{ -qty }} products.
{% endif %}

当然,{{ -qty }}不起作用。

是否存在没有传递包含绝对值的第二个变量的变通方法?类似于模板过滤器的东西,可以将值转换为无符号整数。

谢谢!

4 个答案:

答案 0 :(得分:12)

您可以滥用某些字符串过滤器:

{% if qty > 0 %}
  Please, sell {{ qty }} products.
{% elif qty < 0 %}
  Please, buy {{ qty|slice:"1:" }} products.
{% endif %}

 Please, sell {{ qty|stringformat:"+d"|slice:"1:" }} products.

但您应该在视图中执行此操作或编写自定义过滤器。

答案 1 :(得分:4)

您应该使用自定义过滤器。

以下是两种不同的方法:

1)您可以定义negate过滤器:

# negate_filter.py
from django import template
register = template.Library()

@register.filter
def negate(value):
    return -value

然后在您的模板中,将代码{% load negate_filter %}添加到顶部,然后将{{ -qty }}替换为{{ qty|negate }}

2)如果您愿意,也可以用一个buy_sell过滤器替换整个过滤器:

# buy_sell_filter.py
from django import template
register = template.Library()

@register.filter
def buy_sell(value):
    if value > 0 :
      return 'sell %s' % value
    else :
      return 'buy %s' % -value

然后你的模板应该是

{% if qty %} Please, sell {{ qty|buy_sell }} products.{% endif %}

您甚至可以在过滤器中包含整个字符串,然后将整个模板设为{{qty | buy_sell}}。

这两个选项都是合理的,具体取决于模板的其余部分。例如,如果你有很多字符串使用买入为负数而卖出为正数,则做第二个。

答案 2 :(得分:3)

与Python中的everything一样,有一个库:django-mathfilters

然后您可以像这样简单地使用abs过滤器:

Please, sell {{ qty|abs }} products.

答案 3 :(得分:1)

理想情况下,您将在视图中执行检查,将逻辑与显示分开(例如,如果qty = 0会发生什么?) 如果您坚持在模板中进行数学运算,则可以执行类似this hack的操作。

另一种选择是编写自定义过滤器(请参阅this example)。