49

我有一个 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
4

8 回答 8

57

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

import os
import sys

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

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

于 2010-10-16T12:09:02.360 回答
22

您可以很容易地做到这一点,但您需要将 更改settings.py为如下所示:

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

urls.py看起来像这样:

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

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

于 2010-10-16T09:45:28.093 回答
15

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

只需添加以下内容:

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

希望这可以帮助。

于 2016-09-28T12:17:52.433 回答
5

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)

以这种方式执行此操作具有额外的好处,即您的模板目录更干净,如下所示。没有变量,列表中的列表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',
            ],
        },
    },
]

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

于 2020-03-07T19:16:14.697 回答
1

如果您使用的是 virtualenv/virtualenvwrapper(有点过时但仍然有效),您可以使用包含的add2virtualenv命令来扩充您的 python 路径:

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

将该路径复制到剪贴板,然后:

add2virtualenv /path/to/apps/dir
于 2014-10-15T05:42:09.633 回答
0

只需__init__.py在您的应用程序文件夹中添加(总共 4 个下划线)。现在你可以做

urlpatterns = [
        path('polls/',include('apps.polls.urls')),
        path('admin/', admin.site.urls)
]
于 2018-01-06T16:07:23.060 回答
0

就我而言,我的项目文件夹结构如下:

/project/
   /apps/
      /app1/
      /app2/
   /src/
      /settings.py
      ...

所以我用我的这两行解决了这个问题settings.py

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

无需更改urls.py

于 2020-06-25T18:56:48.910 回答
0

通过使用manage.py

# Fisrt create apps folder and appname subfolder
mkdir -p ./apps/<appname>

# Then create new app
python manage.py <appname> ./apps/<appname>
于 2021-05-20T15:16:09.023 回答