How to keep all my django applications in specific folder

Question:

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
Asked By: ikostia

||

Answers:

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

Answered By: Gabi Purcaru

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!

Answered By: Bernhard Vallant

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
Answered By: shacker

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.

Answered By: anshuman

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)
]
Answered By: Aniket Thakur

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.

Answered By: Wayne Lambert

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.

Answered By: C. S. F. Junior

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>
Answered By: CallMarl

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 🙂

Answered By: Muhammadalive

The following worked for me.

This is the folder structure:

/project1
    /apps
        /myapp

inside apps.py under /myapp:

class MyAppConfig(AppConfig):
    name = "apps.myapp"

In the settings.py:

INSTALLED_APPS = [
    ...
    "apps.myapp.apps.MyAppConfig",
]
Answered By: Whale
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.