3

すべての目的と目的でfloatフィールドと同じように機能するカスタムフォームフィールドを作成しようとしていますが、(デフォルトでは)末尾のゼロなしでfloat値を出力します(例:33.0ではなく33)

私は次のように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はどのように機能しますか?:)

おそらく私はここで間違った木を完全に吠えていますが、誰かが私を正しい方向に向けることができれば、私は感謝するでしょう。

4

1 に答える 1

2

あなたの勘は正しいです-FloatFieldは実際にto_pythonはIntegerFieldのメソッドを呼び出していません。実際に何が起こっているのかを説明するために、

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

残りのコードを呼び出す前に。これはさらに役立つかもしれません:__init __()メソッドを使用したPython super()の理解

于 2012-10-22T17:43:20.603 に答える