-1

モデル フィールドの 1 つに呼び出し可能なデフォルト値があります。ModelForm を使用して出力しています。私が理解しているドキュメントから、callableは新しいオブジェクトが作成されたときにのみ呼び出されます。

私が理解していないのは、デフォルトの呼び出し可能オブジェクトで指定されたフィールドの非表示フィールドを取得する理由です.次の出力が得られます。

>>> form = SomeForm()
>>> print form['eventID']

<input id="id_eventID" maxlength="255" name="eventID" type="text" value="event_2c6b2259" /><input id="initial-id_eventID" name="initial-eventID" type="hidden" value="event_cee183d7" />

そして、上記のステートメントを印刷するたびに、eventIDの異なる値が得られます(デフォルト値はランダムな呼び出し可能オブジェクトです..)しかし、私が理解していることから、フォームのインスタンスがが作成されました。そうじゃない?

更新: forms.py

class EventForm(forms.ModelForm):
    class Meta:
        model = EiEventType

models.py

class Event(models.Model):
    eventID = models.CharField(null=True,blank=True,default=random_eventID)
    start = models.DateTimeField(null=True, default=two_min_from_now)
    signal = models.ManyToManyField(Signal,null=True)
    ...
    ...
    ...

ランダム関数は次のように定義されます。

def random_eventID()
    return "event_" + str(uuid.uuid4())[:5]

def two_min_from_now()
    return datetime.datetime.now() + timedelta(minutes=2)
4

1 に答える 1

1

簡単な答え: 関数を渡す代わりに、括弧を追加して関数を呼び出します。 default=random_eventID()

長い答え:

ModelForm関数をデフォルト値として保存し、それを値のように使用しているように見えます。あなたが観察したように、関数を何度も呼び出しています。モデル インスタンスを作成するEvent()と、init で関数を 1 回呼び出すだけで機能し、アクセスするたびに変更されることはありません。

ただし、を作成するEventFormと、実際にはモデルインスタンスを作成するのではなく、インポートを通じてモデルのさまざまなプロパティから値を入力するだけなので、関数参照をデフォルト値として保存していると思われます。

関数にデバッグ ブレークポイントを配置すると、この動作に気付くことができます。関数random_eventIDが異なるスタック トレースで複数回呼び出されrandom_eventID()、モデル クラスのインポート中に 1 回呼び出されることを確認できます。

def random_eventID()
    import pdb; pdb.set_trace()
    return "event_" + str(uuid.uuid4())[:5]
于 2013-10-17T23:49:52.843 に答える