Reputation: 2575
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?
Upvotes: 47
Views: 48720
Reputation: 243
django-typer allows this to be specified more concisely than the BaseCommand class which uses argparse. The above could be rewritten:
from django_typer import TyperCommand
class Command(TyperCommand):
help = 'Help for command'
def handle(self, n: int):
print(n ** 2)
Upvotes: 0
Reputation: 69983
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
Upvotes: 2
Reputation: 411252
Yes. The mechanism for doing so is described here, but basically, you can get the argument from args[0]
.
Upvotes: 3
Reputation: 1880
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
Upvotes: 93