将django FloatField限制为2位小数

时间:2014-05-19 13:25:56

标签: python django forms models

我正在寻找一种方法将Django中的FloatField限制为2位小数,如果有人知道如何在不使用DecimalField的情况下完成此操作。

我试过decimal_places=2但是这只是在float字段中给我一个迁移错误,所以我认为这个方法只能在DecimalFields中工作。

3 个答案:

答案 0 :(得分:27)

如果您只关心FloatField在表单中的显示方式,则可以使用模板过滤器floatformat

来自Django Docs:

  

如果与数字整数参数一起使用,则floatformat将数字四舍五入到多个小数位。

例如,如果value = 34.23234,则在您的模板中:

{{ value|floatformat:2 }}  # outputs 34.23

答案 1 :(得分:4)

如果您希望确保模型始终仅使用两个小数位保存,而不是仅仅在模板中更改模型的显示,则模型上的自定义保存方法将非常有用。下面的示例模型显示了如何。

class MyDataModel(models.Model):
    my_float = models.FloatField()

    def save(self, *args, **kwargs):
        self.my_float = round(self.my_float, 2)
        super(MyDataModel, self).save(*args, **kwargs)

现在,每次保存模型时,您都将保证该字段仅填充两位小数的浮点数。这可以推广到四舍五入到任意数量的小数位。

答案 2 :(得分:0)

自Django 1.8+起,您可以为FloatField /或任何ModelField使用自定义验证器:

def validate_decimals(value):
    try:
        return round(float(value), 2)
    except:
        raise ValidationError(
            _('%(value)s is not an integer or a float  number'),
            params={'value': value},
        )

...在您的模型中,您可以像这样应用它:

from django.db import models

class MyModel(models.Model):
    even_field = models.FloatField(validators=[validate_decimals])