Django custom command error: unrecognized arguments
Django custom command error: unrecognized arguments
我正在尝试创建一个类似于 createsuperuser
的命令,它将接受两个参数(用户名和密码)
它在 django 1.7 中工作正常但在 1.8 中不工作。 (我也在使用 python3.4)
这是我写的代码
myapp/management/commands/createmysuperuser.py
from django.core.management.base import BaseCommand, CommandError
from django.contrib.auth.models import User
class Command(BaseCommand):
help = 'Create a super user'
def handle(self, *args, **options):
if len(args) != 2:
raise CommandError('need exactly two arguments for username and password')
username, password = args
u, created = User.objects.get_or_create(username=username)
if created:
u.is_superuser = True
u.is_staff = True
u.set_password(password)
u.save()
else:
raise CommandError("user '%s' already exist" % username)
return "Password changed successfully for user '%s'" % u.username
当我尝试 运行 这个命令时
$ python manage.py createmysuperuser myuser mypassword
我收到这个错误
usage: manage.py createmysuperuser [-h] [--version] [-v {0,1,2,3}]
[--settings SETTINGS]
[--pythonpath PYTHONPATH] [--traceback]
[--no-color]
manage.py createmysuperuser: error: unrecognized arguments: myuser mypassword
但是当我不传递任何参数时它会引发 CommandError
这是预期的。
CommandError: need exactly two arguments for username and password
在 django 1.8 中你应该add arguments你的命令:
class Command(BaseCommand):
...
def add_arguments(self, parser):
parser.add_argument('username')
parser.add_argument('password')
add_argument()
argparse
的方法是 documented here.
UPDATE:默认情况下,参数在 options
参数中传递,因此 handle()
方法应如下所示:
def handle(self, *args, **options):
username = options['username']
password = options['password']
...
而且您不需要检查 args
列表的长度 - argparse
已经完成了。这是推荐的方法,但如果您想使用 args
参数,则必须使用 "compatibility mode" 并将添加的参数命名为 args
:
class Command(BaseCommand):
def add_arguments(self, parser):
parser.add_argument('args')
def handle(self, *args, **options):
if len(args) != 2:
...
阅读文档 first chapter 中的 "Changed in Django 1.8" 旁注(在 closepoll.py
示例之后)。
UPDATE2:这是完整的工作示例:
from django.core.management.base import BaseCommand
class Command(BaseCommand):
def add_arguments(self, parser):
parser.add_argument('username')
parser.add_argument('password')
def handle(self, *args, **options):
username = options['username']
password = options['password']
return u'Username: %s Password: %s' % (username, password)
对于最小的更改,只需在命令 class 中添加方法 add_arguments()
。
def add_arguments(self, parser):
parser.add_argument('args', nargs='*')
您可以像以前一样继续使用args
。
我正在尝试创建一个类似于 createsuperuser
的命令,它将接受两个参数(用户名和密码)
它在 django 1.7 中工作正常但在 1.8 中不工作。 (我也在使用 python3.4)
这是我写的代码
myapp/management/commands/createmysuperuser.py
from django.core.management.base import BaseCommand, CommandError
from django.contrib.auth.models import User
class Command(BaseCommand):
help = 'Create a super user'
def handle(self, *args, **options):
if len(args) != 2:
raise CommandError('need exactly two arguments for username and password')
username, password = args
u, created = User.objects.get_or_create(username=username)
if created:
u.is_superuser = True
u.is_staff = True
u.set_password(password)
u.save()
else:
raise CommandError("user '%s' already exist" % username)
return "Password changed successfully for user '%s'" % u.username
当我尝试 运行 这个命令时
$ python manage.py createmysuperuser myuser mypassword
我收到这个错误
usage: manage.py createmysuperuser [-h] [--version] [-v {0,1,2,3}]
[--settings SETTINGS]
[--pythonpath PYTHONPATH] [--traceback]
[--no-color]
manage.py createmysuperuser: error: unrecognized arguments: myuser mypassword
但是当我不传递任何参数时它会引发 CommandError
这是预期的。
CommandError: need exactly two arguments for username and password
在 django 1.8 中你应该add arguments你的命令:
class Command(BaseCommand):
...
def add_arguments(self, parser):
parser.add_argument('username')
parser.add_argument('password')
add_argument()
argparse
的方法是 documented here.
UPDATE:默认情况下,参数在 options
参数中传递,因此 handle()
方法应如下所示:
def handle(self, *args, **options):
username = options['username']
password = options['password']
...
而且您不需要检查 args
列表的长度 - argparse
已经完成了。这是推荐的方法,但如果您想使用 args
参数,则必须使用 "compatibility mode" 并将添加的参数命名为 args
:
class Command(BaseCommand):
def add_arguments(self, parser):
parser.add_argument('args')
def handle(self, *args, **options):
if len(args) != 2:
...
阅读文档 first chapter 中的 "Changed in Django 1.8" 旁注(在 closepoll.py
示例之后)。
UPDATE2:这是完整的工作示例:
from django.core.management.base import BaseCommand
class Command(BaseCommand):
def add_arguments(self, parser):
parser.add_argument('username')
parser.add_argument('password')
def handle(self, *args, **options):
username = options['username']
password = options['password']
return u'Username: %s Password: %s' % (username, password)
对于最小的更改,只需在命令 class 中添加方法 add_arguments()
。
def add_arguments(self, parser):
parser.add_argument('args', nargs='*')
您可以像以前一样继续使用args
。