Come funziona l'opzione di comando gestione un uso Django personalizzato?
-
25-09-2019 - |
Domanda
Il dottore Django mi dica come aggiungere un'opzione per il mio comando Django di gestione personalizzato, tramite un esempio:
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'),
)
Poi la documentazione solo smettere. Come si potrebbe scrivere il metodo handle
per questa classe per verificare se l'utente ha fornito un'opzione di --delete
? A volte Django rende le cose facili difficili: - (
Soluzione
Si può fare in questo modo:
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')
Do atto che alcune parole chiave in Python sono riservate in modo da poter gestire quelli che utilizzano **kwargs
. In caso contrario, è possibile utilizzare argomenti normali (come ho fatto con close
)
Altri suggerimenti
Un piccolo suggerimento su come definire i comandi (nome della chiave, dest
) e la gestione dei valori di default (in make_option
e nel 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)
In codice Django troverete "argomenti chiave" (**kwargs
) spesso nominato come **options
, che è più suggestiva (mi attengo a questa convenzione di denominazione).
Il valore predefinito può essere o specificata in make_option, o tramite il metodo dict.get
,
che consente per un valore di default.
Non c'è alcun motivo per non u utilizzare sia di default, dovrebbe il metodo Command.handle
essere chiamato manualmente, dove il dizionario **options
poteva mancare questa voce.