¿Cómo funciona la opción de comandos de gestión de un uso Django personalizada?
-
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: - (
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.