Еще один вопрос, почему django не видит приложение

Я хочу, чтобы все приложения находились в одной общей папке apps. Но настройки django не хотят видеть созданное приложение.

как я создал приложение

  1. Создали пустую папку apps в корневом каталоге проекта.
  2. Создал пустой файл __init__.py в ней
  3. Создайте пустую папку внутри папки apps - creative_performer
  4. .
  5. Запустите команду 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 не рекомендуется.

Другой вариант - распространять свои приложения как повторно используемые приложения и устанавливать их вообще отдельно.

Вернуться на верх