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

时间:2010-11-17 18:51:52

标签: 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'),
    )

然后文档停止了。如何为此类编写handle方法以检查用户是否提供了--delete选项?有时候Django会让事情变得简单: - (

2 个答案:

答案 0 :(得分: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')

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

答案 1 :(得分: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)

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

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

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