カスタムフォームフィールドを持つDjangoアプリケーションがありますが、その中にはコンストラクタの処理が遅いものがあります。私は最近、Django自体が起動したとき、たとえユーザーがそのフォームをビューで必要とする何かをする前であっても、それらのコンストラクターが呼び出されていることを知りました。Djangoの起動時にフォームフィールド__init__メソッドが呼び出されるのはなぜですか?
なぜサーバー起動時にインスタンス化されるのですか?
例:
urls.py:私は、その後、そのフィールドコンストラクタ内でブレークポイントを設定した場合
class MyForm(ModelForm):
class Meta:
model = MyModel
field1 = MyChoiceField()
class MyChoiceField(ChoiceField):
def __init__(self, choices=(), required=True, widget=None, label=None,
initial=None, help_text=None, *args, **kwargs):
super(ChoiceField, self).__init__(required, widget, label, initial,
help_text, *args, **kwargs)
self.choices = [(m.id, m.name) for m in ReallyLargeTableModel.objects.all()]
:
from myapp.views import view1
...
url(r'^test$', view1.test),
ビュー/ view1.py Djangoを起動すると、問題のビューがそのfを必要としなくても、私はどのページも要求するのが初めてですormまたはフィールド。スタックトレースは、urls.pyのインポート行に戻ります。
これは、view1.testをインポートするのではなく、urls.pyでview1をインポートするためですか?
編集:これはここで、特定のジャンゴされていない動作を示したテストケースである:
class Something():
def __init__(self):
print "Something __init__() called"
class UsesSomething():
field = Something()
あなたが対話型端末でこれを実行した場合、それは(「を初期化何かを印刷します)と呼ばれる。私はUsesSomethingオブジェクトを実際にインスタンス化していないので、これは私には驚くべきことでした。
それは私のアプリケーションで重要だったことがないだので、本当に、正直に注意を払ったことはありませんが、それは右に感じることはありません。 '__init__'はクラスがインスタンス化されるまで呼び出されません。通常、クラスには実際に初期化を実行するために必要な追加データが必要です。それでも、ビューをインポートせずに単に 'url(r '^ test $'、 'myapp.views.view1.test')を使うとどうなりますか? –