3

自从升级到 Django 1.8 后,我的 Django 管理命令中出现了一个奇怪的错误。

我按如下方式运行它:

python manage.py my_command $DB_NAME $DB_USER $DB_PASS

然后我收集论点如下:

class Command(BaseCommand):

def handle(self, *args, **options):
    print args
    db_name = args[0]
    db_user = args[1]
    db_pass = args[2]
    self.conn = psycopg2.connect(database=db_name, user=db_user,
                                 password=db_pass)

以前这工作正常,但现在我看到这个错误:

usage: manage.py my_command [-h] [--version] [-v {0,1,2,3}]
                                             [--settings SETTINGS]
                                             [--pythonpath PYTHONPATH]
                                             [--traceback] [--no-color]
manage.py my_command: error: unrecognized arguments: test test test

它甚至没有达到print args声明的程度。

如果我在没有任何参数的情况下运行它,那么它就会出错,这args[0]不足为奇。

我在这里用args错了吗?还是发生了其他事情?

4

2 回答 2

5

这是 Django 1.8 中的一个变化。如此处详述:

只接受位置参数的管理命令¶

如果您编写了一个只接受位置参数的自定义管理命令,并且您没有指定 args 命令变量,您可能会收到类似错误:无法识别的参数:...,因为变量解析现在基于 argparse 而不是' t 隐式接受位置参数。您可以通过简单地设置 args 类变量来使您的命令向后兼容。但是,如果您不必保持与旧 Django 版本的兼容性,最好实现新的 add_arguments() 方法,如编写自定义 django-admin 命令中所述。

于 2015-05-14T18:10:27.243 回答
4
def add_arguments(self, parser):
    parser.add_argument('args', nargs='*')

添加上面的兼容性,打破它是更新 django 的人的一个非常不明智的决定。

于 2017-09-07T04:58:57.927 回答