16

Django 文档通过示例告诉我如何向我的 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 让简单的事情变得困难:-(

4

2 回答 2

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

于 2010-11-17T19:13:28.857 回答
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

于 2013-01-10T10:05:40.657 回答