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