2015-05-14 54 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