2010-11-17 105 views
14

Django的文档告诉我如何将选项添加到我的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的使简单的事情很难:-(

回答

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

保留字是'del'。允许'delete'作为变量名称。 – 2012-02-28 21:23:41

+0

对于其他人来这个线程,这个资源也帮助我:http://www.alexonlinux.com/pythons-optparse-for-human-beings#telling_optparse_to_parse_arguments – 2016-08-17 21:14:36

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代码中,您会发现通常命名为**options的“关键字参数”(**kwargs),这更具启发性(我坚持这种命名约定)。

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

没有理由不u使用违约,应您的Command.handle方法人工呼叫,其中**options字典可能缺少此项。