【发布时间】:2015-11-02 08:10:23
【问题描述】:
我想从我的一项测试中调用 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)
【问题讨论】:
-
显示你的命令代码(至少
option_list定义) -
添加了add_arguments函数源码。
-
你真的用
arg1='12', arg2='abc', arg3='zbb', arg4='12345'关键字参数来称呼它吗?你知道对于选项parser.add_argument('--url')关键字arg 应该是url吗? -
您在哪里将
arg1、arg2等定义为参数?您的电话与https://docs.djangoproject.com/en/1.8/ref/django-admin/#running-management-commands-from-your-code中的示例不同 -
我没有用 arg1、arg2 等... 显然。我改变了问题。