限制Django FloatField到2位小数
我想知道怎么在Django中把FloatField
限制为只有两位小数。有没有人知道怎么做到这一点,而不需要使用DecimalField
?
我试过用decimal_places=2
,但是这导致了浮点字段的迁移错误。所以我在想,这个方法可能只适用于DecimalFields。
3 个回答
2
从Django 1.8版本开始,你可以为FloatField或者任何模型字段使用自定义的验证器:
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])
23
如果你想确保你的模型在保存时总是只保留两位小数,而不是仅仅在模板中改变显示方式,那么在你的模型上自定义一个保存方法会非常有效。下面的示例模型就展示了怎么做。
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)
现在,每次你保存模型时,都能保证这个字段只会保存两位小数的浮点数。这个方法也可以扩展到四舍五入到任意位数的小数。
81
如果你只关心你的 FloatField
在表单中是怎么显示的,你可以使用一个叫做 floatformat
的模板过滤器。
根据Django文档的说明:
如果你给它传一个数字作为参数,floatformat 会把数字四舍五入到指定的小数位数。
举个例子,如果值是 34.23234,那么在你的模板中:
{{ value|floatformat:2 }} # outputs 34.23