我正在寻找一种方法将Django中的FloatField限制为2位小数,如果有人知道如何在不使用DecimalField的情况下完成此操作。
我试过decimal_places=2
但是这只是在float字段中给我一个迁移错误,所以我认为这个方法只能在DecimalFields中工作。
答案 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])