Как сохранить все мои приложения django в определенной папке

У меня есть проект Django, скажем, "project1". Типичная структура папок для приложений:

/project1/
         /app1/
         /app2/
         ...
         __init__.py
         manage.py
         settings.py
         urls.py

Что делать, если я хочу хранить все мои приложения в отдельной папке, например, приложения? Таким образом, структура должна выглядеть следующим образом:

/project/
         apps/
              app1/
              app2/
              ...
         __init__.py
         manage.py
         settings.py
         urls.py

Ответ 1

Вы можете добавить свою папку apps в свой путь к python, вставив следующее в свой settings.py:

import os
import sys

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

Затем вы можете использовать все приложения в этой папке так же, как и в своем корневом каталоге проекта!

Ответ 2

Вы можете сделать это очень легко, но вам нужно изменить settings.py, чтобы выглядеть так:

INSTALLED_APPS = (
    'apps.app1',
    'apps.app2',
    # ...
)

И ваш urls.py выглядит следующим образом:

urlpatterns = patterns('', 
    (r'^app1/',include('apps.app1')),    
    (r'^app2/',include('apps.app2')),    
)

.. и изменить любой import, чтобы указать на расположение приложения

Ответ 3

Как насчет использования переменной BASE_DIR, уже присутствующей в settings.py.

Просто добавьте следующее:

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

Надеюсь, что это поможет.

Ответ 4

Если вы используете virtualenv/virtualenvwrapper (и вы должны быть), вы можете использовать прилагаемую команду add2virtualenv для увеличения вашего пути python:

mkdir apps
cd apps
pwd
[/path/to/apps/dir]

Скопируйте этот путь в буфер обмена, затем:

add2virtualenv /path/to/apps/dir

Ответ 5

Просто добавьте __init__.py (всего 4 символа подчеркивания) в папку приложений. Теперь вы можете просто сделать

urlpatterns = [
        path('polls/',include('apps.polls.urls')),
        path('admin/', admin.site.urls)
]