如何在Django模板过滤器中进行数学运算?

2 投票
4 回答
6703 浏览
提问于 2025-04-16 19:23

在我的数据库里,有一个整数字段用来存储价格信息,比如“10399”、“84700”。

显示的时候,它们应该变成“$103.99”和“$847.00”。

我需要把整数乘以0.01来显示。

我在想,是否可以通过Django的模板过滤器来实现这个功能?就像这样:

{{ item.price|int_to_float_and_times_0.01 }}

还有一个问题,其实我选择整数是因为我觉得在数据库中使用整数比使用浮点数更高效。这是真的吗?

4 个回答

0

你可以在把整数传给模板之前,简单地对它们进行修改,比如用列表推导式来处理:

context['prices'] = [float(item) * 0.01 for item in Model.objects.all()]

(如果你的Python版本支持的话,你也可以去掉括号,把它变成生成器,这样可以让你的代码占用更少的内存。)

使用 int 代替 float 让你的网站明显变快的可能性很小。如果你想要一个安全的价格类型,建议使用 decimalhttp://docs.python.org/library/decimal.html

1

你可以使用 widthratio 模板标签 来进行除法运算:

${% widthratio item.price 100 1 %}

(结果是 (a/b)*c,如果 a、b、c 是 widthratio 的三个参数)

最终结果会是:$103.99 (对应的数字是 10399)

8

你可以自己创建一个模板过滤器,基本上就是把输入的数值除以100,这样就能达到你想要的效果。例如:

在你的应用程序目录下的 my_app/templatetags/currency_helper.py 文件中:

from django import template
register = template.Library()

@register.filter
def to_currency(value):
    return float(value) / 100.0

然后在你的模板中使用:

{% load currency_helper %}

etc...

{{item.price|to_currency}}

另外,如果我是你,我会把货币的数值存储在数据库里,使用小数类型,这样就能避免后续处理时的麻烦和四舍五入错误。

撰写回答