Python 将django FloatField限制为小数点后2位
我正在寻找一种方法,将Django中的FloatField限制在小数点后2位。是否有人知道如何在不使用DecimalField的情况下实现这一点Python 将django FloatField限制为小数点后2位,python,django,forms,models,Python,Django,Forms,Models,我正在寻找一种方法,将Django中的FloatField限制在小数点后2位。是否有人知道如何在不使用DecimalField的情况下实现这一点 我尝试了decimal\u places=2,但这只是在浮点字段中给了我一个迁移错误,所以我认为这种方法只能在十进制字段中工作 如果您只关心浮动字段在表单中的显示方式,则可以使用模板过滤器 从Django文档: 如果与数字整型参数一起使用,floatformat会将数字舍入到小数点后许多位 例如,如果value=34.23234,则在模板中: {{ v
我尝试了
decimal\u places=2
,但这只是在浮点字段中给了我一个迁移错误,所以我认为这种方法只能在十进制字段中工作 如果您只关心浮动字段在表单中的显示方式,则可以使用模板过滤器
从Django文档:
如果与数字整型参数一起使用,floatformat会将数字舍入到小数点后许多位
例如,如果value=34.23234,则在模板中:
{{ value|floatformat:2 }} # outputs 34.23
自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])
如果您确实希望确保您的模型总是以两位小数保存,而不仅仅是更改模板中模型的表示形式,那么在您的模型上使用自定义保存方法将非常有效。下面的示例模型显示了如何使用
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)
现在,每次保存模型时,您都将保证该字段只填充两位小数的浮点值。这可以概括为四舍五入到任意小数位数。为什么不使用分界字段
?您是否尝试过此models.FloatField(默认值=到某个值)
因为十进制字段在输入框中添加了递增和递减箭头,我不希望出现这种情况,所以我没有尝试默认方法,但会查找它,看看它是否符合我的需要。@AidanDoherty所以,原因只是它在表单上的显示方式如何?您知道-您可以通过为字段设置不同的小部件来更改它。@alecxe所以我可以通过覆盖Decimal field小部件来更改其类型值来实现这一点。这很好,但并不完全是我想要的,但我相信这将在未来的项目中派上用场,谢谢您的帮助。这很有帮助。我正在使用带有DjangoFloatField(默认值为0.00)
的Postgres,但它通过删除小数点后的无用0s
将其保存为0
。。这是有道理的。。但我想在模板中显示一致的值0.00
或5.43
<代码>{value | floatformat:2}
为确保数据字段在数据库级别总是四舍五入到两位小数,做了一个小技巧。如何将此用于django ModelForm实例?这不起作用。验证程序不会更改正在保存的值,它们只验证某个值是否可接受。如果该值不可接受,则应引发异常。这不会修改正在保存的值。请参阅下面的“我的答案”,以获得确保浮点字段舍入到小数点后两位的答案。如果在查询集上调用update
方法,则不会执行此save
方法。