Skip to main content

Quick How-To : Custom Django Management Commands

Django's manage.py runs a variety of Django admin tasks. We can add custom tasks as well. This is useful for running commands through a shell script, as with a cron job

Say you have a package called myPackage. Let's add a custom command called doAllTheThings .

This example uses Python 2.7.6 and Django 1.7 . Here's a preview of the files we'll create.

    $ tree
        .
        |-- myPackage
        | |-- management
        | | |-- __init__.py
        | | `-- commands
        | | |-- __init__.py
        | | `--allTheThings.py

1. Add your package to INSTALLED_APPS in settings.py if it isn't there already.

In your package directory, create management and management/commands subdirectories. The names matter.

2. Create __init__.py files in both to signal that these are packages. ( This may be different in Python 3.)

    $ touch management/__init__.py
        $ touch management/commands/__init__.py

Forgetting to add __init__.py will cause an error like this:

    $ python manage.py allTheThings
        Unknown command: 'allTheThings'

3. Create a python file with the same name as your command.

        $ emacs allTheThings.py

Here are the essential parts of a command:

        from django.core.management import BaseCommand

        #The class must be named Command, and subclass BaseCommand
        class Command(BaseCommand):
        # Show this when the user types help
        help = "My test command"

        # A command must define handle()
        def handle(self, *args, **options):
            self.stdout.write("Doing All The Things!")

4. Run the command like any other Django management command. From the top directory in your Django project,

    $ python manage.py doAllTheThings

For more detail, including how to parse arguments,see the Django developer guide.