我想从我的一个测试中调用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)
根据您发布的那段代码,我得出结论,call_command参数是必需的
所需的命名参数必须通过*args
传递,而不仅仅是位置。
**kwargs
绕过解析器。所以它看不到你定义的任何东西。**kwargs
可以覆盖*args
的值,但*args
仍然需要为每个必需的参数提供一些东西。如果你不想这样做,那么关闭required
属性。