2010-11-17 10 views
14

El Django doc dime cómo agregar una opción para mi mando administración personalizado Django, a través de un ejemplo:¿Cómo se usa la opción de comando de administración personalizada de 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'), 
    ) 

A continuación, los documentos a detenernos. ¿Cómo se podría escribir el método handle para esta clase para verificar si el usuario ha suministrado una opción --delete? A veces Django hace las cosas fáciles difíciles :-(

Respuesta

19

Puede hacerlo de esta manera:.

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

tenga en cuenta que algunas palabras clave en Python están reservados para que pueda manejar los que utilizan **kwargs contrario, puede utilizar argumentos normales (como lo hice con close)

+1

La palabra reservada es 'del'. 'delete' está permitido como nombre de variable. –

+0

Para otros que vienen a este hilo, este recurso me ayudó también: http://www.alexonlinux.com/pythons-optparse-for-human-beings#telling_optparse_to_parse_arguments –

7

Una pequeña sugerencia acerca de la definición de los comandos (nombre de la clave, dest) y gastos de valores por defecto (en make_option y en el 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) 

En el código de Django encontrará "argumentos de palabras clave" (**kwargs) a menudo nombrado como **options, que es más sugerente (me atengo a esta convención de nombres).

El valor predeterminado se puede especificar en make_option, o mediante el método dict.get, , que permite un valor predeterminado.

No hay razón para no u utilizar ambos defecto, se debe llamar manualmente el método Command.handle, donde el diccionario **options podía faltar esta entrada.

Cuestiones relacionadas