45

I need to pass in an integer argument to a base command in Django. For instance, if my code is:

from django.core.management import BaseCommand

class Command(BaseCommand):
    def handle(self, *args, **options, number_argument):
        square = number_argument ** 2
        print(square)

I want to run:

python manage.py square_command 4

so, it will return 16.

Is there a way I can pass an argument through the terminal to the command I want to run?

lmiguelvargasf
  • 63,191
  • 45
  • 217
  • 228
Peter Graham
  • 2,467
  • 2
  • 24
  • 29

3 Answers3

88

Add this method to your Command class:

def add_arguments(self, parser):
    parser.add_argument('my_int_argument', type=int)

You can then use your option in the code, like this:

def handle(self, *args, **options):
    my_int_argument = options['my_int_argument']

The benefit of doing it this way is that the help output is automatically generated for manage.py my_command --help

Rob Bednark
  • 25,981
  • 23
  • 80
  • 125
acidjunk
  • 1,751
  • 18
  • 24
3

Yes. The mechanism for doing so is described here, but basically, you can get the argument from args[0].

SukiCZ
  • 300
  • 5
  • 10
mipadi
  • 398,885
  • 90
  • 523
  • 479
  • 6
    Found a more complete answer here: http://stackoverflow.com/questions/10568864/two-arguments-in-django-admin-custom-command?rq=1 – Peter Graham Dec 22 '14 at 22:49
  • 1
    @PeterGraham now you should use the `add_arguments` method, which was added in version 1.8, so I wouldn't recommend that more complete answer anymore. – eric Jan 02 '18 at 15:11
2

This is pretty simple by implementing the add_arguments method. Then, you can get the value of this argument in the handle method as follows:

class Command(BaseCommand):
    help = 'Help for command'

    def add_arguments(self, parser):
        parser.add_argument('n', type=int, help='help for n')

    def handle(self, *args, **options):
        n = options['n']
        square = n ** 2
        print(square)

The parameter parser is an instance of argparse.ArgumentParser (see the docs). Now you can add as many arguments as you want by calling parser's add_argument method. In the code above, you are expecting a parameter n of type int which is gotten in the handle method from options.

If you want to see the help displayed, run the following:

python manage.py square_command --help

That will produce an output similar to the following one:

usage: manage.py create_documents [-h] [--version] [-v {0,1,2,3}] [--settings SETTINGS] [--pythonpath PYTHONPATH] [--traceback] [--no-color] [--force-color]
                                  [--skip-checks]
                                  n

Help for command

positional arguments:
  n                     help for n

lmiguelvargasf
  • 63,191
  • 45
  • 217
  • 228