Еще один вопрос, почему django не видит приложение
Я хочу, чтобы все приложения находились в одной общей папке apps. Но настройки django не хотят видеть созданное приложение.
как я создал приложение
- Создали пустую папку apps в корневом каталоге проекта.
- Создал пустой файл
__init__.py
в ней - Создайте пустую папку внутри папки apps -
creative_performer
.
- Запустите команду
python manage.py startapp creative_performer apps/creative_performer
Получили следующую структуру
/gpanel
/projects
urls.py
settings.py
....
/apps
__init__.py
/creative_performer
/migrations
__init__.py
apps.py
models.py
....
manage.py
settings.py
PROJECT_APPS = ['creative_performer']
INSTALLED_APPS = [
"django.contrib.admin",
"django.contrib.auth",
"django.contrib.contenttypes",
"django.contrib.sessions",
"django.contrib.messages",
"django.contrib.staticfiles",
] + PROJECT_APPS
Но после запуска сервера получил
File "<frozen importlib._bootstrap>", line 1050, in _gcd_import
File "<frozen importlib._bootstrap>", line 1027, in _find_and_load
File "<frozen importlib._bootstrap>", line 1004, in _find_and_load_unlocked
ModuleNotFoundError: No module named 'creative_performer'
Я также попробовал создать приложение с помощью команды
django-admin startapp creative_performer
Тот же результат
Если создать приложение в корне проекта, не используя общую папку apps
, все начинает работать
Else попробовал изменить PROJECT_APPS
на PROJECT_APPS = ['apps.creative_performer']
Но получил
django.core.exceptions.ImproperlyConfigured: Cannot import 'creative_performer'. Check that 'apps.creative_performer.apps.CreativePerformerConfig.name' is correct.
Но CreativePerformerConfig.name == 'creative_performer'
неясно, почему возникает ошибка
P.S.
Решено изменением apps.py
Изменение name = 'apps.creative_performer'
и settings.py
PROJECT_APPS = ['apps.creative_performer']
Но является ли это нормальным поведением django? Действительно ли невозможно создавать приложения внутри общей папки без изменения настроек по умолчанию?
Django's installed_apps
использует обычную систему импорта Python для поиска установленных приложений. В конечном счете, именно это имеет значение: чтобы ваши приложения можно было найти и импортировать, что соответствует семантике упаковки и импорта в Python. Таким образом, для большинства сторонних приложений, которые вы устанавливаете через pip
, уже доступны в PYTHONPATH для импорта в качестве имени верхнего уровня.
Поскольку ваше приложение creative_performer
фактически является подпакетом под apps
, вам нужно использовать 'apps.creative_performer'
в вашем installed_apps
и установить то же имя приложения, чтобы использовать его в этом случае.
Другой вариант - удалить файл apps/__init__.py
и добавить каталог apps
в переменную окружения PYTHONPATH (или изменить sys.path
), чтобы справиться с этим. Таким образом, ваши приложения будут просто отдельными пакетами. Но правильнее всего было бы оставить все как есть с 'apps.creative_performer'
- это похоже на то, что делает django в своих contrib
подпакетах, например. Вообще, изменять ваш pythonpath не рекомендуется.
Другой вариант - распространять свои приложения как повторно используемые приложения и устанавливать их вообще отдельно.