我正在尝试创建一个自定义表单字段,该表单字段在所有意图和目的上都与float字段相同,但是(默认情况下)输出不带尾随零的float值,例如33而不是33.0

我试图像这样简单地扩展django.forms.FloatField:

class CustomFloatField(django.forms.FloatField):

    def to_python(self, value):
        """
        Returns the value without trailing zeros.
        """
        value = super(django.forms.FloatField, self).to_python(value)
        # code to strip trailing zeros
        return stripped_value


但这最终导致我收到验证错误。当我仔细查看FloatField类时,我注意到在它自己的to_python()方法中,它调用super(IntegerField,self).to_python(value)进行检查,以确保可以将值转换为int,而在这里,代码似乎跳了起来。这使我彻底困惑。如果必须尝试将FloatField的值强制转换为int,它将如何工作? :)

很可能我在这里完全把错误的树吠了,但是如果有人能指出我正确的方向,我将不胜感激。

最佳答案

您的预感是正确的-FloatField并未真正调用IntegerField的to_python方法。为了说明实际情况,

class A(object):
    def __init__(self):
        print "A initialized"

    def to_python(self, value):
        print "A: to_python"
        return value

class B(A):
    def __init__(self):
        print "B initialized"

    def to_python(self, value):
        value = super(B, self).to_python(value)
        print "B: value = "
        print int(value)
        return int(value)

class C(B):
    def to_python(self, value):
        value = super(B, self).to_python(value)
        print "C: value = "
        print float(value)
        return float(value)

c = C()
c.to_python(5.5)


给出输出

B initialized
A: to_python
C: value =
5.5


放在上下文中,FloatField to_python中的行:

value = super(IntegerField, self).to_python(value)


实际上是在调用Field的to_python,这很简单,

def to_python(self, value):
    return value


在调用其余代码之前。这可能会进一步帮助您:Understanding Python super() with __init__() methods

关于django - 扩展django.forms.FloatField,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13014655/

10-10 16:27