Como se usa opção de comando de gerenciamento personalizado django?
-
25-09-2019 - |
Pergunta
O documento Django Diga -me como adicionar uma opção ao meu comando de gerenciamento personalizado do Django, por exemplo:
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'),
)
Então os documentos simplesmente param. Como se escreveria o handle
método para esta classe para verificar se o usuário forneceu um --delete
opção? Às vezes Django dificulta as coisas fáceis :-(
Solução
Você pode fazer assim:
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')
Observe que algumas palavras -chave no python são reservadas para que você possa lidar com aqueles que usam **kwargs
. Caso contrário, você pode usar argumentos normais (como eu fiz com close
)
Outras dicas
Uma pequena sugestão sobre como definir os comandos (nome da chave, dest
) e lidar com valores padrão (em make_option
e no comando):
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)
No código Django, você encontrará "argumentos de palavras -chave" (**kwargs
) frequentemente nomeado como **options
, o que é mais sugestivo (eu me apego a essa convenção de nomenclatura).
O valor padrão pode ser especificado em make_option ou através do dict.get
método, que permite um valor padrão.
Não há razão para você não usar Ambas Padrões, deve seu Command.handle
método ser chamado manualmente, onde o **options
O dicionário pode estar perdendo esta entrada.