Comment l'option d'une utilisation de la commande de gestion Django personnalisée?
-
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: - (
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.