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 приписывать.

Другие вопросы по тегам