Question

I am trying to get the best possible set up for developing my django project from the start and I'm having trouble getting everything to play nicely in the directory structure. I have set up virtualenv's (env in this example) so that I can deploy a clean empty python environment for every django project.

The basic structure is as follows:

/env/
    /bin
    /db         <--- Django DB
    /downloads
    /lib
    /static     <--- Where css/imgs/js etc is served from
    /project/   <--- Django root
            /__init__.py
            /settings.py
            /manage.py
            /appsfolder/
                 /appname/
                       /__init__.py
                       /models/
                              /__init__.py
                              /somemodel.py
                       /urls/
                             /__init__.py
                             /someurl.py
                       /views/
                             /__init__.py
                             /someview.py

This is the basic layout; I want each project to have a directory for applications, and in each application have a separate folder for models, view and urls.

The problem I am having is with the python path and how the modules are handled.

Within an application, I don't want to have to refer to the project when importing models i.e I should be using :

import appname.models.modelname

not:

import projectname.models.modelname

to help reusablility

In the models directory, I have the following init.py

from model1 import ModelName1
from model2 import ModelName2
from model3 import ModelName3

__all__ = ['ModelName1', 'ModelName2', 'ModelName3']

But when I try to use a separate url file (in /appname/urls/urlfile.py) and import the models like the following:

from appname.models.somemodel import ModelName

I get a "module not found" error.

while:

from appsfolder.appname.models.somemodel import ModelName

works ok

I presume this is because the application is not directly on the python path, instead it is in a subfolder called appsfolder, but I'm not sure how to go about fixing this, while keeping everything reuseable and relative.

I know one solution is to put all apps directly on the python path under site-packages, but I don't really like this idea, as I think that the applications should be in the project if you are using virtualenv's

Was it helpful?

Solution

You can put the following in your settings.py to add your appsfolder to your PYTHONPATH:

import os
import sys

PROJECT_ROOT = os.path.dirname(__file__)
sys.path.insert(0, os.path.join(PROJECT_ROOT, 'appsfolder'))
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top