1. ホーム
  2. django

[解決済み] AppConfig.ready()のオーバーライド

2023-04-26 14:43:13

質問

Django の基本を掴もうとしています。特に、アプリケーションがどのように動作するか。 ドキュメントを参照してください。 https://docs.djangoproject.com/en/stable/ref/applications/#methods

そして、クラスAppConfigのコードには、次のように書かれています。

def ready(self):
    """
    Override this method in subclasses to run code when Django starts.
    """

さて、これは私の例です。

my_app/apps.py

class MyAppConfig(AppConfig):
    name = 'my_app'

    def ready(self):
        print('My app')

私はただ、ready メソッドを動作させたいだけです。つまり、Django が my_app を見つけたら、 ready メソッドを実行させればいいのです。

アプリは INSTALLED_APPS に登録されています。

python manage.py runserver'を実行してみます。そして何も出力されません。

readyメソッドの中でブレークポイントを置くと、デバッガはそこで止まりません。

私の理解は間違っているのか、教えてください。よろしくお願いします。

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'my_app',
]

そして、ビューを作成しました

my_app/views.pyを作成します。

def index(request):
    print('Print index')

urls.py

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^$', my_app_views.index, name='home')
]

さて、ビューが動作していますね。これは、アプリケーションが登録されていることを意味します。

どのように解決するのですか?

次の2つのうちどちらかを行う必要があります。明示的にどの AppConfig の中で INSTALLED_APPS :

INSTALLED_APPS = [
    'my_app.apps.MyAppConfig'
]

あるいは default_app_config の中に __init__.py を追加してください。

# my_app/__init__.py
default_app_config = 'my_app.apps.MyAppConfig'

(そして INSTALLED_APPS をそのままにする)。

現状では、Django はどのような AppConfig を見つけることができず、単に無いものとみなしてしまいます。そのため、ビューなどは動きますが ready() メソッドが呼び出されることはありません。

ここで に関連する部分です。 .

Edit : Django 3.2 以降では、以下のように default_app_config の指定はもはや必要ありません。 を指定する必要がなくなり、事実上非推奨となっている - であるため、Django 3.2 以降を使用している人にとって、この回答は冗長です。