2010-11-17 13 views
14

Django doc me dire comment ajouter une option à ma commande de gestion django personnalisée, par exemple:Comment utiliser l'option de commande de gestion personnalisée 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'), 
    ) 

Ensuite, les docs simplement arrêter. Comment écrire la méthode handle pour cette classe pour vérifier si l'utilisateur a fourni une option --delete? Parfois, Django rend les choses faciles difficiles :-(

Répondre

19

Vous pouvez le faire comme ceci:.

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') 

Prenez note que certains mots clés en Python sont réservés afin que vous puissiez gérer ceux qui utilisent **kwargs Sinon, vous pouvez utiliser arguments normaux (comme je l'ai fait avec close)

+1

Le mot réservé est 'del'. 'delete' est autorisé en tant que nom de variable. –

+0

Pour d'autres qui viennent à ce sujet, cette ressource m'a aussi aidé: http://www.alexonlinux.com/pythons-optparse-for-human-beings#telling_optparse_to_parse_arguments –

7

Une petite suggestion concernant la définition des commandes (nom de la clé, dest) et la gestion des valeurs par défaut (en make_option et dans la commande):

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) 

Dans le code Django, vous trouverez des "mots-clés" (**kwargs) souvent nommés **options, ce qui est plus suggestif (je m'en tiens à cette convention de nommage).

La valeur par défaut peut être spécifiée dans make_option ou par la méthode dict.get, , ce qui autorise une valeur par défaut.

Il n'y a aucune raison pour ne pas utiliser u les deux par défaut, si votre méthode Command.handle être appelée manuellement, où le dictionnaire **options pouvait manquer cette entrée.