我有一个相当广泛的Django网站,处理需要以2位小数显示的货币金额,但由于对这些金额执行了数学运算,因此在幕后使用4位小数。有些页面通过AJAX调用获得这些金额(作为JSON),其他页面通过标准视图获得它们=>模板变量传递。我的模型使用models.DecimalField(max_digits=10, decimal_places=4, default=Decimal('0'))
现在网站足够大,我需要找出处理这种小数舍入的一致方法,但无论我采用哪种方式,它似乎都很尴尬。以下是我能想到的两种方式,但每种方式都不太理想。
前端:视图保留小数不变,有4个位置。模板使用floatformat:2
过滤器,JS函数使用.toFixed(2)
来转换传入的JSON数据。问题:需要在模板代码和 JS代码中处理许多地方的舍入。
后端:将所有小数的视图舍入到2个位置,并将它们作为字符串传递给模板。同样,对传入的AJAX调用serialize all decimals to 2 places的响应。问题:视图现在正在处理格式而不是模板,并且特殊情况在模板中的格式不同。
是否存在处理十进制舍入的“正确的,Djangonic”方式?
答案 0 :(得分:1)
考虑到这纯粹是一个演示问题,我的直觉就是将其保留在模板中。也就是说,模板应该尽可能愚蠢,你可能不希望硬编码你的小数位数作为整个模板的幻数。
我可能会做以下事情:
这样,您可以将所有演示逻辑保留在模板级别,但仍然保持DRY原则。它仍然意味着对你的模板和JavaScript进行了大量的编辑,但是如果不进入真正的hacky领域,我真的不能想到任何更干净的方法。