我想在Django模板中始终使用我的变量的正值。变量的符号只是一个文本含义:
{% if qty > 0 %}
Please, sell {{ qty }} products.
{% elif qty < 0 %}
Please, buy {{ -qty }} products.
{% endif %}
当然,{{ -qty }}
不起作用。
是否存在没有传递包含绝对值的第二个变量的变通方法?类似于模板过滤器的东西,可以将值转换为无符号整数。
谢谢!
答案 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)。