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