2010-10-16 20 views
25

Mam projekt Django, powiedzmy "project1". Typowa struktura folderów dla aplikacji jest:Jak zachować wszystkie aplikacje django w określonym folderze

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

Co należy zrobić, jeśli chcę, aby pomieścić wszystkie moje aplikacje w jakimś osobnym folderze „apps” na przykład? Tak że struktura powinna wyglądać następująco:

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

Odpowiedz

36

Możesz dodać folder apps do ścieżki Pythona poprzez wstawienie następujących w settings.py:

import os 
import sys 

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

Następnie można wykorzystać wszystkie aplikacje w tym folderze właśnie w taki sam sposób, jak były w katalogu głównym projektu!

+2

Jeśli mnie pytasz, prowadzi to do zamieszania. –

+1

Prowadzi to do konfliktów podczas uruchamiania testów. –

12

Można to zrobić bardzo łatwo, ale trzeba zmienić settings.py wyglądać tak:

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

i Twojego urls.py wyglądać tak:

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

.. i modyfikować import s zwrócić do miejsca aplikacji

+0

Czy to działa dobrze z biegiem testowym? – yellottyellott

+4

Polecam, aby nie używać tej metody, ponieważ może to spowodować, że inne aplikacje nie będą mogły odwoływać się do Twojej aplikacji i będą wymagać zmiany wszystkich importów w aplikacjach, aby wskazywały na nowy katalog. Myślę, że właściwą drogą jest [odpowiedź Bernharda Vallanta] (http://stackoverflow.com/a/3948821/1057102). – sleblanc

+0

Ten sam wzór jest przestrzegany w projekcie [django-oscar] (https://github.com/django-oscar/django-oscar). – Dineshs91

1

Jeśli używasz virtualenv/virtualenvwrapper (i powinno być), można użyć dołączonego polecenia add2virtualenv poszerzyć swoją ścieżkę Pythona:

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

Copy że ścieżka do schowka, a następnie:

add2virtualenv /path/to/apps/dir 
2

Może wykorzystasz zmienną BASE_DIR już obecną w settings.py.

Wystarczy dodać następujące:

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

nadzieję, że to pomaga.

0

Po prostu dodaj __init__.py (łącznie 4 podkreślenia) w folderze aplikacji. Teraz możesz po prostu wykonać: