扩展django.forms.FloatField

时间:2012-10-22 15:27:49

标签: django

我正在尝试创建一个自定义表单字段,与所有意图和目的的浮点字段相同,但是(默认情况下)输出浮点值,不带尾随零,例如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),它会检查以确保value可以转换为int,而且我的代码似乎在绊倒。这让我彻底糊涂了。如果FloatField必须尝试将其值转换为int,它是如何工作的? :)

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

1 个答案:

答案 0 :(得分:2)

你的预感是对的 - 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