Voglio chiamare un comando di gestione Django da uno dei miei test. Sto usando django.core.management.call_command
per questo. E non funziona.Il call_command di Django fallisce con gli argomenti richiesti mancanti
Ho un comando con 4 argomenti richiesti. Quando lo chiamo io, si lamenta tutti gli argomenti mancano anche se io li sto passando:
call_command('my_command', url='12', project='abc', website='zbb', title='12345')
ottengo l'errore di comando base che --url, --project, --website e --title mancano .
Non ho specificato una destinazione diversa per questi argomenti.
Ho guardato il sorgente call_command
e individuato il problema alla seguente riga in 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
è argomenti posizionali passati a call_commands, che è vuoto. Sto solo passando argomenti con nome. parser.parse_args
lamenta che mancano le variabili richieste.
Questo è in Django 1.8.3.
Ecco funzione add_arguments del mio comando (ho appena tolto le corde di aiuto per brevità):
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)
mostra il codice del comando (almeno le definizioni di 'option_list') – Anentropic
Aggiunta la sorgente della funzione add_arguments. – zmbq
lo stai davvero chiamando con 'arg1 = '12 ', arg2 =' abc ', arg3 =' zbb ', arg4 =' 12345'' parole chiave args? sei consapevole che per l'opzione 'parser.add_argument ('- url')' la parola chiave arg dovrebbe essere 'url'? – Anentropic