El call_command de Django falla con la falta de argumentos requeridos

Quiero llamar a un comando de administración de Django desde una de mis pruebas. Estoy usando django.core.management.call_command para esto. Y no funciona.

Tengo un comando con 4 argumentos requeridos. Cuando lo llamo, se queja de que faltan todos los argumentos, aunque los estoy pasando:

 call_command('my_command', url='12', project='abc', website='zbb', title='12345') 

Recibo el error del comando base que faltan –url, –project, –website y –title.

No especifiqué un destino diferente para estos argumentos.

Miré la fuente de call_command y call_command el problema en la siguiente línea en call_command :

 if command.use_argparse: # Use the `dest` option name from the parser option opt_mapping = {sorted(s_opt.option_strings)[0].lstrip('-').replace('-', '_'): s_opt.dest for s_opt in parser._actions if s_opt.option_strings} arg_options = {opt_mapping.get(key, key): value for key, value in options.items()} defaults = parser.parse_args(args=args) ****** THIS ***** defaults = dict(defaults._get_kwargs(), **arg_options) # Move positional args out of options to mimic legacy optparse args = defaults.pop('args', ()) 

args es los argumentos posicionales pasados ​​a call_commands, que está vacío. Sólo estoy pasando argumentos con nombre. parser.parse_args queja de que parser.parse_args las variables requeridas.

Esto está en Django 1.8.3.

Aquí está la función add_arguments de mi comando (acabo de eliminar las cadenas de ayuda por brevedad):

 def add_arguments(self, parser): parser.add_argument('--url', action='store', required=True) parser.add_argument('--project', action='store', required=True) parser.add_argument('--continue-processing', action='store_true', default=False) parser.add_argument('--website', action='store', required=True) parser.add_argument('--title', action='store', required=True) parser.add_argument('--duplicate', action='store_true',default=False) 

Sobre la base del código que publicaste, he llegado a la conclusión de que el argumento call_command es obligatorio.

que los argumentos con nombre requeridos se deben pasar a través de *args , no solo los posicionales.

**kwargs pasa **kwargs alto el analizador. Así que no ve nada de lo que definiste allí. **kwargs puede anular los valores de *args , pero *args todavía necesita algo para cada argumento requerido. Si no desea hacerlo, desactive el atributo required .