Как засунуть все приложения в одну папку 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',
]
Начиная с версии 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',
]
