Django-dj is a console command which removes the need to use Django's manage.py
script.
$ django-project> python manage.py runserver/syncdb/etc
$ django-project/some/dir> python ../../manage.py runserver/syncdb/etc
$ django-project> dj runserver/syncdb/etc
$ django-project/some/dir> dj runserver/syncdb/etc
Instead of carefully referencing manage.py
from whichever directory you happen to be in, dj
works anywhere in or under your Django project directory. You can even completely remove your manage.py
file if you wish.
dj
identifies Django projects by looking for directories which are Python packages containing settings
and urls
submodules.
With pip
, run the command:
sudo pip install django-dj
Or with easy_install
run:
sudo easy_install django-dj
Alternatively, you can manually install by copying the dj
file to somewhere on your $PATH
, perhaps ~/bin/
.
How dj
finds Django projects ----------------------------
As mentioned above, dj
identifys Django projects by looking for directories which are Python packages (e.g. contain an __init__.py[oc]
file) containing the following submodules:
settings
urls
If a package directory contains both submodules then dj
takes it to be a Django project and tries to run Django's management tool on it.
Python modules/packages are identified by looking for .py
/.pyc
/.pyo
files of the correct name, or directories of the correct name containing a __init__.py
/.pyc
/.pyo
file. For performance and security reasons Python's own import functionality is not used (no Python modules are executed while searching for Django projects).
The directories dj
looks in are chosen as follows. The search starts in the working directory this script is executed from and moves upwards to the parent directory, and then the parent's parent directory and so forth until either a Django project is found, or the root of the filesystem is reached.
If a file named .djangoproject
is encountered during the search, a complete search of the subtree at the directory holding the .djangoproject
file is triggered.
The strategy of looking through the parent directories works well so long as long as dj
is executed from a child directory of the Django project. Consider the following project structure:
myproject/
|-- staticfiles/
|-- somefile.jpg
|-- somefile.png
|-- somefile.gif
|-- django-project/
|-- urls.py
|-- settings.py
|-- __init__.py
If you run dj
from inside staticfiles
, it won't find django-project
because it will just check parents of staticfiles
, and django-project
is not a parent of staticfiles
. You can make dj
find django-project
by creating an empty file called .djangoproject
in in a common parent of staticfiles
and django-project
. In this case creating it in myproject
would work. This will tell dj to do a full search of all directories under myproject
rather than just its parents.