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/
.
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.