2015-05-14 56 views
3

自从升级到Django 1.8后,我的Django管理命令中出现了一个奇怪的错误。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这里错了吗?或者还在发生其他事情?

+0

这是一个真实的案例吗? Django中已经有'dbshel​​l'。你正在重新发明轮子。你可以用'python manage.py dbshel​​l'调用DB命令行。 – cezar

回答

5

这是对Django 1.8的改变。至于详细的here

Management commands that only accept positional arguments¶

If you have written a custom management command that only accepts positional arguments and you didn’t specify the args command variable, you might get an error like Error: unrecognized arguments: ..., as variable parsing is now based on argparse which doesn’t implicitly accept positional arguments. You can make your command backwards compatible by simply setting the args class variable. However, if you don’t have to keep compatibility with older Django versions, it’s better to implement the new add_arguments() method as described in Writing custom django-admin commands.

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

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

+0

这是指定参数的正确方法。但我不同意这是非常不明智的。有时你必须打破过去,向前迈进。 – cezar