¿Cómo funciona la opción de comandos de gestión de un uso Django personalizada?

StackOverflow https://stackoverflow.com/questions/4208006

  •  25-09-2019
  •  | 
  •  

Pregunta

El doc Django dime cómo agregar una opción para mi mando administración personalizado Django, a través de un ejemplo:

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 solo se detienen. ¿Cómo se podría escribir el método handle para esta clase para comprobar si el usuario ha suministrado una opción --delete? A veces Django hace las cosas fáciles difícil: - (

¿Fue útil?

Solución

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

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

Otros consejos

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 Django encontrará "argumentos de palabra clave" (**kwargs) a menudo nombrados como **options, que es más sugerente (me quedo con esta convención).

El valor predeterminado puede especificarse ya sea en make_option, o a través del método dict.get, que permite un valor predeterminado.

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top