3

我正在尝试创建一个自定义表单字段,该字段与浮点字段的所有意图和目的相同,但是(默认情况下)输出没有尾随零的浮点值,例如 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,它是如何工作的?:)

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

4

1 回答 1

2

你的预感是对的——FloatField 并没有真正调用to_pythonIntegerField 的方法。为了说明真正发生的事情,

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's 中的行to_python

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

真的是调用 Field 的 to_python,很简单,

def to_python(self, value):
    return value

在调用其余代码之前。这可能会进一步帮助您:使用 __init__() 方法理解 Python super()

于 2012-10-22T17:43:20.603 回答