如何将我的所有django应用程序保存在特定文件夹中

iko*_*tia 35 python django django-apps

我有一个Django项目,让我们说"project1".应用程序的典型文件夹结构是:

/project1/
         /app1/
         /app2/
         ...
         __init__.py
         manage.py
         settings.py
         urls.py
Run Code Online (Sandbox Code Playgroud)

如果我想将所有应用程序保存在某个单独的文件夹中,例如'apps',我该怎么办?所以该结构应如下所示:

/project/
         apps/
              app1/
              app2/
              ...
         __init__.py
         manage.py
         settings.py
         urls.py
Run Code Online (Sandbox Code Playgroud)

Ber*_*ant 46

您可以apps通过在以下内容中插入以下内容将文件夹添加到python路径settings.py:

import os
import sys

PROJECT_ROOT = os.path.dirname(__file__)
sys.path.insert(0, os.path.join(PROJECT_ROOT, 'apps'))
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用此文件夹中的所有应用程序,就像它们在项目根目录中一样!

  • 这会在运行测试时导致冲突. (4认同)
  • 如果你问我,这会导致混乱. (2认同)

Gab*_*aru 15

你可以很容易地做到这一点,但你需要改变它settings.py看起来像这样:

INSTALLED_APPS = (
    'apps.app1',
    'apps.app2',
    # ...
)
Run Code Online (Sandbox Code Playgroud)

urls.py看起来像这样:

urlpatterns = patterns('', 
    (r'^app1/',include('apps.app1')),    
    (r'^app2/',include('apps.app2')),    
)
Run Code Online (Sandbox Code Playgroud)

..并修改任何imports以指向应用程序位置

  • 我建议不要使用此方法,因为它可能会导致其他应用程序无法引用您自己的应用程序,并且会要求您更改应用程序中的所有导入以指向新目录.我认为正确的方法是[Bernhard Vallant的回答](http://stackoverflow.com/a/3948821/1057102). (4认同)

ans*_*man 14

你如何利用BASE_DIR已经存在于settings.py.

只需添加以下内容:

import sys
sys.path.insert(0, os.path.join(BASE_DIR, 'apps'))
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助。


小智 7

Berhard Vallant作为's 或's 答案的轻微变体Anshuman,这里是一个可以放置在中的替代片段settings.py

import os
import sys  # Insert this line

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)
Run Code Online (Sandbox Code Playgroud)

以这种方式执行此操作还有一个额外的好处,即您的模板目录更加干净,如下所示。如果没有变量,列表的列表中将APPS_DIR会有很多重复。<your_project_dir_name>/apps/DIRSTEMPLATES

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            os.path.join(APPS_DIR, '<app_name>/templates/<app_name>'),
            os.path.join(APPS_DIR, '<app_name>/templates/<app_name>'),
            ...
        ],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]
Run Code Online (Sandbox Code Playgroud)

您可以使用INSTALLED_APPS中给出的短格式名称正常列出列表中的应用程序apps.py,或者使用appname.apps.AppnameConfig替换appname为应用程序名称的长格式语法。