【问题标题】:Django best practice to round decimals: frontend or backend?Django 舍入小数的最佳实践:前端还是后端?
【发布时间】:2011-11-22 20:57:21
【问题描述】:

我有一个相当广泛的 Django 站点,它处理需要以 2 位小数显示的货币金额,但由于对这些金额执行了数学运算,因此在幕后使用了 4 位小数。一些页面通过 AJAX 调用(作为 JSON)获取这些数量,而其他页面通过标准视图 => 模板变量传递来获取它们。我的模型使用models.DecimalField(max_digits=10, decimal_places=4, default=Decimal('0'))

现在网站已经足够大了,我需要找出一种一致的方法来处理这种小数四舍五入,但无论我采用哪种方法,它都显得很尴尬。以下是我能想到的两种方式,但似乎都不太理想。

  1. 前端:视图保留小数点不变,保留 4 位。模板使用floatformat:2 过滤器,JS 函数使用.toFixed(2) 来转换传入的JSON 数据。问题:模板代码JS代码中很多地方都需要处理舍入。

  2. 后端:视图将所有小数四舍五入到 2 位,并将它们作为字符串传递给模板。同样,对传入 AJAX 调用的响应 serialize all decimals to 2 places。问题:视图现在处理格式而不是模板,特殊情况不能在模板中以不同的格式设置。

是否有一种“正确的 Djangonic”方式来处理小数舍入?

【问题讨论】:

  • 我认为您的问题没有明确的答案,但我尽量让模板保持低调,所以我会在服务器端进行格式化。

标签: django decimal rounding


【解决方案1】:

考虑到这纯粹是一个演示问题,我的直觉是将其保留在模板中。也就是说,模板应该尽可能地笨拙,并且您可能不想将您的小数位数硬编码为整个模板中的幻数。

我可能会做以下事情:

  • 不要处理视图中的任何小数位内容,除非它是计算逻辑的一部分。
  • 编写一个自定义模板过滤器,根据您在 settings.py 中定义的参数格式化您的浮点数
  • 编写一个具有相同功能的自定义 JavaScript 函数
  • 使用您的新过滤器和函数来处理出现在模板和 AJAX 回调中的小数。

这样您就可以将所有演示逻辑保留在模板级别,但您仍然保持 DRY 原则。它仍然意味着对您的模板和 JavaScript 进行大量编辑,但我真的想不出任何更清洁的方法来做到这一点,而不会进入真正的 hacky 领域。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-19
    • 2019-02-05
    • 2021-04-01
    • 2013-03-13
    • 2010-09-24
    • 2020-03-19
    • 2011-03-06
    • 1970-01-01
    相关资源
    最近更新 更多