Python 将django FloatField限制为小数点后2位

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

我正在寻找一种方法,将Django中的FloatField限制在小数点后2位。是否有人知道如何在不使用DecimalField的情况下实现这一点


我尝试了
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小部件来更改其类型值来实现这一点。这很好,但并不完全是我想要的,但我相信这将在未来的项目中派上用场,谢谢您的帮助。这很有帮助。我正在使用带有Django
FloatField(默认值为0.00)
的Postgres,但它通过删除小数点后的无用
0s
将其保存为
0
。。这是有道理的。。但我想在模板中显示一致的值
0.00
5.43
<代码>{value | floatformat:2}
为确保数据字段在数据库级别总是四舍五入到两位小数,做了一个小技巧。如何将此用于django ModelForm实例?这不起作用。验证程序不会更改正在保存的值,它们只验证某个值是否可接受。如果该值不可接受,则应引发异常。这不会修改正在保存的值。请参阅下面的“我的答案”,以获得确保浮点字段舍入到小数点后两位的答案。如果在查询集上调用
update
方法,则不会执行此
save
方法。