如何使用Django自定义管理命令选项?

pet*_*108 15 django django-manage.py

Django doc告诉我如何通过一个例子为我的django自定义管理命令添加一个选项:

from optparse import make_option

class Command(BaseCommand):
    option_list = BaseCommand.option_list + (
        make_option('--delete',
            action='store_true',
            dest='delete',
            default=False,
            help='Delete poll instead of closing it'),
    )
Run Code Online (Sandbox Code Playgroud)

然后文档就停止了.如何编写handle此类的方法来检查用户是否提供了--delete选项?有时Django很容易让事情变得困难:-(

Wol*_*lph 19

你可以这样做:

from optparse import make_option

class Command(BaseCommand):
    option_list = BaseCommand.option_list + (
        make_option('--del',
            action='store_true',
            help='Delete poll'),
        make_option('--close',
            action='store_true',
            help='Close poll'),
    )

    def handle(self, close, *args, **kwargs):
        del_ = kwargs.get('del')
Run Code Online (Sandbox Code Playgroud)

请注意,Python中的某些关键字是保留的,因此您可以处理这些关键字**kwargs.否则你可以使用普通参数(就像我做的那样close)


Tom*_*dor 7

关于定义命令(键名称dest)和处理默认值(在make_option命令中和命令中)的一点建议:

class Command(BaseCommand):
    option_list = BaseCommand.option_list + (
        make_option('--del',
            action='store_true',
            help='Delete all polls.',
            dest='your_name_for_delete',
            default=False),
        make_option('--close',
            action='store_true',
            help='Close all polls.'),
    )

    def handle(self, close, *args, **options):
        if options.get('your_name_for_delete'):
            Poll.objects.delete()
        if options.get('close', False):
            Poll.objects.update(closed=True)
Run Code Online (Sandbox Code Playgroud)

在Django代码中,你会发现"关键字参数"(**kwargs)经常被命名为**options,这更具暗示性(我坚持这个命名约定).

默认值可以在make_option中指定dict.get,也可以通过允许默认值的方法指定.

如果您的方法是手动调用的话,没有理由不使用这两个默认值,字典可能会缺少此条目.Command.handle**options