我正在尝试创建一个自定义表单字段,与所有意图和目的的浮点字段相同,但是(默认情况下)输出浮点值,不带尾随零,例如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,它是如何工作的? :)
我很可能在这里完全咆哮错误的树,但如果有人能指出我正确的方向,我将不胜感激。
答案 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