2010-10-16 53 views
25

我有一個Django項目,比如說「project1」。對於應用 典型的文件夾結構是:如何保持我的所有Django應用程序在特定文件夾中

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

我應該怎麼做,如果我想擁有我所有的應用程序在一些單獨的文件夾,「應用」爲例子嗎?這樣的結構應如下所示:

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

回答

36

您可以通過插入添加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

如果你問我,這會導致混淆。 – 2010-10-16 14:52:46

+1

運行測試時會導致衝突。 – 2015-01-01 18:36:09

12

你可以做到這一點很容易,但你需要更改settings.py看起來像這樣:

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

和你urls.py看起來像這樣:

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

..和修改任何import s到指向該應用位置

+0

這是否與測試跑步者很好地工作? – yellottyellott 2013-04-26 15:24:31

+4

我建議不要使用此方法,因爲它可能導致其他應用程序無法引用您自己的應用程序,並且需要您更改應用程序中的所有導入以指向新目錄。我認爲正確的方法是[Bernhard Vallant的回答](http://stackoverflow.com/a/3948821/1057102)。 – sleblanc 2013-08-26 21:37:54

+0

在[django-oscar](https://github.com/django-oscar/django-oscar)項目中遵循相同的模式。 – Dineshs91 2017-06-17 17:19:43

1

如果您使用的virtualenv/virtualenvwrapper(你應該),您可以用附送的add2virtualenv命令來增強你的Python路徑:

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

複製路徑到剪貼板,然後:

add2virtualenv /path/to/apps/dir 
2

您如何利用settings.py中已有的BASE_DIR變量。

只需添加以下內容:

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

希望這有助於。

0

只需在您的應用程序文件夾中添加__init__.py(共4個下劃線)。現在你可以做

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