开发者

How to keep all my django applications in specific folder

I have a Django project, let's say "project1". Typical folder structure for applications is:

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

What should I do if I want to hold all of my applications in some separate folder, 'apps' for example? So that structure should开发者_运维知识库 look like the following:

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


You can add your apps folder to your python path by inserting the following in your settings.py:

import os
import sys

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

Then you can use all the apps in this folder just in the same way as they were in your project root!


You can do this very easily, but you need to change the settings.py to look like this:

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

And your urls.py to look like this:

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

.. and modify any imports to point to the app location


How about you utilize the BASE_DIR variable already present in the settings.py.

Just add the following:

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

Hope this helps.


As a slight variant to Berhard Vallant's or Anshuman's answers, here is an alternative snippet to place in 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)

Doing it in this way has the added benefit that your template directories are cleaner as they will look like below. Without the APPS_DIR variable, there will be a lot of repitition of <your_project_dir_name>/apps/ within the DIRS list of the TEMPLATES list.

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',
            ],
        },
    },
]

You can list the apps within the INSTALLED_APPS list as normal with either the short-form name given in apps.py or by using the long-form syntax of appname.apps.AppnameConfig replacing appname with your app's name.


It's easy and simple you need to add to settings.py

import os
import sys

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

and edit your app config for example

old app config:

    class MyappConfig(AppConfig):
          default_auto_field = 'django.db.models.BigAutoField'
          name = 'myapp'

to new app config:

    class MyappConfig(AppConfig):
        default_auto_field = 'django.db.models.BigAutoField'
        label='myapp'
        name = 'apps.myapp'

than installed apps example:

INSTALLED_APPS = [
     ...
     'apps.myapp.apps.MyappConfig'
     ...
]

I think it's very usefull and helpfull.Good luck :)


If you're using virtualenv/virtualenvwrapper (which is a bit dated but still valid), you can use the included add2virtualenv command to augment your python path:

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

Copy that path to clipboard, then:

add2virtualenv /path/to/apps/dir


Just add __init__.py (4 underscores in total) in your apps folder. Now you can just do

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


In my case, my project folder structure is the following:

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

So I've solved it with these two lines on my settings.py:

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

No need to alter urls.py.


By using manage.py

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

# Then create new app
python manage.py <appname> ./apps/<appname>
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜