python - 具有浮点形式输入的django整数模型字段

标签 python django forms widget

我正在使用将货币值存储为整数的 Django 模型。即 GBP22.35 存储为 2235。

当该模型呈现为表单时,我需要能够将一个小部件与该整数字段相关联,以便可以像它是一个浮点值一样进行编辑(即小数点后两位 - 22.35)并按此进行验证. form.save() 然后需要将 native 整数值保存到数据库中。

我已经尝试创建一个自定义的 FormField/Widget 对,它涉及在小部件渲染中除以 100,然后在字段 to_python 方法中乘以备份,但如果表单上有错误,一切都会出错。小部件不断重新划分值(value)。

我意识到这可以通过使用浮点/小数模型字段来避免,但在这种情况下这不是一个选项。

这是人们以前做过的事情吗?任何指针? 谢谢。

最佳答案

您可以实现 IntegerField 的子类来处理幕后转换:

import decimal
from django.db import models
from django.core import exceptions
from django.utils.translation import ugettext_lazy as _

class CentsField(models.IntegerField):
    empty_strings_allowed = False
    default_error_messages = {
        'invalid': _("'%(value)s' value must be a decimal number."),
    }
    description = _("Fixed-point number")

    __metaclass__ = models.SubfieldBase

    def to_python(self, value):
        if value is None or isinstance(value, decimal.Decimal):
            return value
        try:
            if isinstance(value, int):
                return decimal.Decimal(value) / 100
            else:
                return decimal.Decimal(value)
        except decimal.InvalidOperation:
            raise exceptions.ValidationError(
                self.error_messages['invalid'],
                code='invalid',
                params={'value': value},
            )

    def get_prep_value(self, value):
        return int(value * 100)

在您的 Django 代码中应表现为 DecimalField,但在您的数据库中应表现为 IntegerField

更新:更简单的实现源自 IntegerField 而不是 DecimalField;添加了在 DecimalField.to_python

中实现的验证

关于python - 具有浮点形式输入的django整数模型字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22326721/

相关文章:

python - 如何在新计算机上镜像 Anaconda 安装?

python - 在 scipy 中指定大于不等式

Django 单元测试 - 配置不当错误

python - 当我尝试从 Python 调用 Jira 项目时,出现 JSON 错误

python - 计算 torch 张量数组的平均值和标准差

python-3.x - 在多对多字段中添加元素并保持顺序

django - 如何在 Django 中指定模板加载的顺序?

python - Firefox 中的 python cgi 问题

php - 多个$form->add() 导致handleRequest() 失败

javascript - 如何使用外部js文件访问表单?如何从客户端隐藏js的敏感内容?