我正在尝试创建一个自定义表单字段,该表单字段在所有意图和目的上都与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/