9

我想总是在 Django 模板中使用我的变量的正值。变量的符号只是文字含义:

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

当然,{{ -qty }}行不通。

是否有不传递包含绝对值的第二个变量的解决方法?类似于将值转换为无符号整数的模板过滤器。

谢谢!

4

4 回答 4

13

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

{% 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.

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

于 2013-04-02T19:05:12.170 回答
5

与Python 中的所有内容一样,有一个库:django-mathfilters

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

Please, sell {{ qty|abs }} products.
于 2014-11-10T09:46:54.910 回答
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 }}.

buy_sell2)如果你愿意,你也可以用一个过滤器替换整个东西:

# 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 }}。

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

于 2013-04-03T06:39:22.310 回答
1

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

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

于 2013-04-02T18:53:35.100 回答