Как засунуть все приложения в одну папку apps?

Я хочу заснуть все свои приложения в одну папку apps

НО я не нашел нормального ответа.

Я пробовал

PROJECT_ROOT = os.path.dirname(__file__)
sys.path.insert(0, os.path.join(PROJECT_ROOT, 'apps'))

и

sys.path.insert(0, os.path.join('BASE_DIR', 'apps'))

и

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

# Insert the two lines below
APPS_DIR = os.path.join(BASE_DIR, '<your_project_dir_name>/apps/')
sys.path.insert(0, APPS_DIR)

и

BASE_DIR = os.path.dirname(os.path.dirname(__file__))
sys.path.insert(0, os.path.join(BASE_DIR, '../apps'))

и везде я прописывал __init__.py

результат одинаковый

Единственное что я смог это просто написать в

INSTALLED_APPS = [
    'apps.myapp',
]

Но такой способ кране нежелательный


Ответы (2 шт):

Автор решения: Бернар Бердикул

Думаю проблема в том как ты вызываешь приложения в списке INSTALLED_APPS=[] То что ты написал в первом варианте правильно:

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
PROJECT_ROOT = os.path.dirname(__file__)
sys.path.insert(0, os.path.join(PROJECT_ROOT, 'apps'))

PROJECT_ROOT это наша корневая папка проекта, где settings.py, wsgi.py и др. И мы добавляем туда еще одну папку apps. Попробуй в INSTALLED_APPS добавлять приложения способом '<app_name>.apps.<app_name>Config'. Как пример приложение 'landing_page':

INSTALLED_APPS = [
  'django.contrib.admin',
  'django.contrib.auth',
  'django.contrib.contenttypes',
  'django.contrib.sessions',
  'django.contrib.messages',
  'django.contrib.staticfiles',
  'landing_page.apps.LandingPageConfig',
]

Как должно выглядеть

→ Ссылка
Автор решения: Speedy Gonzales

Начиная с версии Django 3.1+ авторы перешли с os.path на pathlib поэтому BASE_DIR и PROJECT_ROOT теперь выглядят так:

    BASE_DIR = Path(__file__).resolve().parent.parent
    PROJECT_ROOT = Path(__file__).parent

Если вы хотите хранить все ваши приложения в проекте в одной папке (допустим my_apps), то вам необходимо это указать следующим образом:

import sys
sys.path.append(str(PROJECT_ROOT / 'my_apps'))

обращаю внимание на то, что теперь это не строка. Теперь это <class 'pathlib.PosixPath'> Поэтому необходимо выполнить приведение к типу 'string'

В данном примере PROJECT_ROOT ссылается на уровень где находится settings.py. Если вам необходимо чтобы ваша папка была на уровне manage.py, то тогда:

PROJECT_ROOT = Path(__file__).parent.parent

__init.py__ ни где прописывать не надо

ваши приложения (допустим one_app, two_app) нужно просто указать так:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'one_app',
    'two_app',
]
→ Ссылка