Comment l'option d'une utilisation de la commande de gestion Django personnalisée?

StackOverflow https://stackoverflow.com/questions/4208006

  •  25-09-2019
  •  | 
  •  

Question

Le doc Django me dire comment ajouter une option à ma commande de gestion de django personnalisée, par exemple:

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 documents s'arrêtent. Comment peut-on é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: - (

Était-ce utile?

La solution

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

Ne notez 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 des arguments normaux (comme je l'ai fait avec close)

Autres conseils

Une petite suggestion à propos de la définition des commandes (nom de la clé, dest) et de 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 "arguments" (mot-clé de **kwargs) souvent désignées comme **options, qui est plus suggestif (je tiens à cette convention de nommage).

La valeur par défaut peut être soit spécifié dans make_option, soit par la méthode de dict.get, ce qui permet une valeur par défaut.

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top