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表記がなかったので、こちらを利用しました