Django自定义命令错误:无法识别的参数

mic*_*al 17 python django django-admin

我正在尝试创建一个类似的命令createsuperuser,它将带有两个参数(用户名和密码)

它在django 1.7中运行良好,但在1.8中没有.(我也使用python3.4)

这是我写的代码

MyApp的/管理/命令/ 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
Run Code Online (Sandbox Code Playgroud)

当我尝试运行此命令时

$ 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
Run Code Online (Sandbox Code Playgroud)

但是,当我没有通过任何论据时,它会提出CommandError预期.

CommandError: need exactly two arguments for username and password

cat*_*ran 33

在django 1.8中,你应该为你的命令添加参数:

class Command(BaseCommand):
    ...
    def add_arguments(self, parser):
        parser.add_argument('username')
        parser.add_argument('password')
Run Code Online (Sandbox Code Playgroud)

add_argument()方法argparse记录在这里.

更新:默认情况下,参数在参数中传递,options因此handle()方法应如下所示:

def handle(self, *args, **options):
    username = options['username']
    password = options['password']
    ...
Run Code Online (Sandbox Code Playgroud)

而且你不需要检查args列表的长度- 它已经完成了argparse.这是推荐的方法,但是如果要使用args参数,则必须使用"兼容模式"并将添加的参数命名为args:

class Command(BaseCommand):

    def add_arguments(self, parser):
        parser.add_argument('args')

    def handle(self, *args, **options):
        if len(args) != 2:
            ...
Run Code Online (Sandbox Code Playgroud)

阅读文档第一章中的"更改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)
Run Code Online (Sandbox Code Playgroud)

  • `python manage.py createmysuperuser username myuser password mypasswd`这个命令给出了这个错误`错误:无法识别的参数:密码mypasswd` (2认同)

sha*_*359 7

add_arguments()对于最小的更改,只需在 Command 类中添加该方法即可。

def add_arguments(self, parser):
    parser.add_argument('args', nargs='*')
Run Code Online (Sandbox Code Playgroud)

您可以像以前一样继续使用args