Django管理命令看不到参数?

时间:2015-05-14 18:06:34

标签: django django-1.8

自从升级到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错了吗?或者还有其他事情发生了吗?

2 个答案:

答案 0 :(得分:5)

这是Django 1.8的变化。详见here

  

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

     

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

答案 1 :(得分:3)

def add_arguments(self, parser):
    parser.add_argument('args', nargs='*')

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