Djangoでアプリの数が増えると見づらいかなと思い、アプリ用ディレクトリを作成してみました。
その時に INSTALLED_APPS に AppConfig を指定する場合で少し悩んだため、メモを残します。
なお、こんな感じでプロジェクトとアプリを作成しました。
# Djangoプロジェクトを作成 $ django-admin startproject myproject . # アプリ用ディレクトリを作成 $ mkdir apps # その中に各アプリを作成 $ cd apps/ $ python ../manage.py startapp old_style $ python ../manage.py startapp new_style # 比較対象として、アプリ用ディレクトリを使用しないアプリも用意 $ cd .. $ python manage.py startapp flat_old_style_app $ python manage.py startapp flat_new_style_app
この場合、Djangoプロジェクトのディレクトリ構成は以下となります。
.
├── flat_new_style_app
│ ├── __init__.py
│ ├── apps.py
│ ├── models.py
│ └── views.py
├── flat_old_style_app
│ ├── __init__.py
│ ├── apps.py
│ ├── models.py
│ └── views.py
├── manage.py
├── myproject
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
└── nest_apps
├── new_style
│ ├── __init__.py
│ ├── apps.py
│ ├── models.py
│ └── views.py
└── old_style
├── __init__.py
├── apps.py
├── models.py
└── views.py
目次
環境
設定方法
の各アプリを使うためには、それぞれを INSTALLED_APPS に設定する必要があります。
設定方法は
- an application configuration class (preferred), or
- a package containing an application.
https://docs.djangoproject.com/ja/2.0/ref/settings/#installed-apps
とのことです。
AppConfigを使う方法が推奨されているようですが、今回は
- AppConfigを指定
- パッケージ名を指定
の両パターンを試してみます。
設定はsettingsに行います。
アプリ用ディレクトリがない場合は、
INSTALLED_APPS = [
...
'flat_old_style_app',
'flat_new_style_app.apps.FlatNewStyleAppConfig',
]
とします。
一方、アプリ用ディレクトリがある場合は、
INSTALLED_APPS = [
...
'nest_apps.old_style',
'nest_apps.new_style.apps.NewStyleConfig',
]
と、アプリ用ディレクトリ nest_apps も設定に含めます。
ただ、 AppConfigを使った設定の場合は、これだけだとmakemigrationsなどで
django.core.exceptions.ImproperlyConfigured: Cannot import 'new_style'. Check that 'nest_apps.new_style.apps.NewStyleConfig.name' is correct.
とエラーになります。
そこで、エラーメッセージに従いAppConfigのあるファイルを修正します (今回の場合は nest_apps/new_style/apps.py )。
変数 name に、ディレクトリ名も含めるよう変更します。
class NewStyleConfig(AppConfig): # name = 'new_style' name = 'nest_apps.new_style'
これで makemigrations などが動作します。
その他
INSTALLED_APPSにAppConfig指定が推奨されるようになったタイミングについて
AppConfigはDjango1.7から使えるようになったようです。
INSTALLED_APPSの説明でも、Django1.7から変更されています。
- Django1.6 *1 :https://django.readthedocs.io/en/1.6.x/ref/settings.html#std:setting-INSTALLED_APPS
- Django1.7:https://docs.djangoproject.com/en/1.7/ref/settings/#std:setting-INSTALLED_APPS
なお、文中の説明に preferred が入ったのは、Django1.9からのようです。
https://docs.djangoproject.com/en/1.9/ref/settings/#std:setting-INSTALLED_APPS
preferred が入ったのに合わせ、チュートリアルもDjango1.9から変更されていました。
- 1.8版: https://docs.djangoproject.com/en/1.8/intro/tutorial01/#activating-models
- 1.9版: https://docs.djangoproject.com/en/1.9/intro/tutorial02/#activating-models
細かい修正でもチュートリアルに反映されているのが良いです。
ソースコード
GitHubに上げました。
https://github.com/thinkAmi-sandbox/Django_AppConfig-sample
*1:公式ドキュメントでは1.6表記がなかったので、こちらを利用しました


