Call_command Джанго терпит неудачу с отсутствующими необходимыми аргументами
Я хочу вызвать команду управления Django из одного из моих тестов. я использую django.core.management.call_command
за это. И это не работает.
У меня есть команда с 4 обязательными аргументами. Когда я звоню, он жалуется, что все аргументы отсутствуют, хотя я передаю их:
call_command('my_command', url='12', project='abc', website='zbb', title='12345')
Я получаю ошибку базовой команды, что --url, --project, --website и --title отсутствуют.
Я не указал другое назначение для этих аргументов.
Я посмотрел на call_command
источник и указал на проблему в следующей строке 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
это позиционные аргументы, передаваемые в call_commands, который является пустым. Я только передаю именованные аргументы. parser.parse_args
жалуется, что необходимые переменные отсутствуют.
Это в Django 1.8.3.
Вот функция add_arguments моей команды (я только что удалил строки справки для краткости):
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)
1 ответ
Основываясь на том фрагменте кода, который вы опубликовали, я пришел к выводу, что в call_command необходим аргумент
что требуемые именованные аргументы должны быть переданы через *args
а не только позиционеры.
**kwargs
обходит парсер. Так что он не видит ничего, что вы определили там. **kwargs
может переопределить *args
ценности, но *args
все еще нужно что-то для каждого необходимого аргумента. Если вы не хотите этого делать, выключите required
приписывать.