2010-11-17 12 views
14

Il Django doc mi dica come aggiungere un'opzione per il mio comando gestione Django personalizzato, tramite un esempio:Come si usa l'opzione di comando di gestione personalizzata 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'), 
    ) 

Poi la documentazione appena fermata. Come si scrive il metodo handle per questa classe per verificare se l'utente ha fornito un'opzione --delete? A volte Django rende le cose facili difficili :-(

risposta

19

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

notano che alcune parole chiave in Python sono riservate in modo da poter gestire quelli che utilizzano **kwargs Altrimenti si può usare argomenti normali (come ho fatto con close)

+1

La parola riservata è 'del'. 'delete' è permesso come nome di variabile. –

+0

Per gli altri che arrivano a questo thread, questa risorsa mi ha aiutato anche io: http://www.alexonlinux.com/pythons-optparse-for-human-beings#telling_optparse_to_parse_arguments –

7

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) 

Nel codice Django sono presenti "argomenti di parole chiave" (**kwargs), spesso denominati come **options, che è più allusivo (seguo questa convenzione di denominazione).

Il valore predefinito può essere specificato in make_option o tramite il metodo dict.get, che consente un valore predefinito.

Non c'è alcun motivo per non u utilizzare entrambi default, dovrebbe il metodo Command.handle essere chiamato manualmente, dove il dizionario **options poteva mancare questa voce.

Problemi correlati