2015-08-10 2 views
5

Я хочу вызвать команду управления Django из одного из моих тестов. Я использую для этого django.core.management.call_command. И это не сработает.Ошибка call_command Django с отсутствующими необходимыми аргументами

У меня есть команда с 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

показать код вашей команды (по крайней мере, определения 'option_list') – Anentropic

+0

Добавлен источник функции add_arguments. – zmbq

+0

вы действительно вызываете его с помощью 'arg1 = '12 ', arg2 =' abc ', arg3 =' zbb ', arg4 =' 12345'' keyword args? вам известно, что для параметра 'parser.add_argument ('- url')' ключевое слово arg должно быть 'url'? – Anentropic

ответ

3

Основываясь на том, что часть кода, который размещен, я заключаемый в call_command argument is required

, что требуемые именованные аргументы должны быть переданы через *args, а не только по позициям.

**kwargs обходит парсер. Поэтому он не видит ничего, что вы там определили. **kwargs может переопределять значения *args, но *args все еще нуждается в чем-то для каждого требуемого аргумента. Если вы не хотите этого делать, отключите атрибут required.

+1

Да, я тоже видел это в коде call_command. Это ошибка в call_command. Я не могу передать необходимые аргументы в * args - каков их правильный порядок?Возможно, заказ, который я назвал add_argument, может быть, что-то еще, возможно, это зависит от ОС или версии Python. Я не хочу рисковать. – zmbq

+0

'argparse' старается быть нечувствительным к порядку. – hpaulj

+0

Как это возможно * быть нечувствительным? Если я помещаю в args «1», «2», «3», «4», как определить, какой из них является URL-адресом, какой проект и т. Д.? – zmbq

Смежные вопросы