python - Django 自定义命令错误 : unrecognized arguments

标签 python django django-admin

我正在尝试创建一个类似于 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: 用户名和密码恰好需要两个参数

最佳答案

在 django 1.8 中你应该 add arguments给你命令:

class Command(BaseCommand):
    ...
    def add_arguments(self, parser):
        parser.add_argument('username')
        parser.add_argument('password')
argparse

add_argument() 方法是documented here .

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

def handle(self, *args, **options):
    username = options['username']
    password = options['password']
    ...

而且您不需要检查 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:
            ...

阅读 first chapter 中的“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)

关于python - Django 自定义命令错误 : unrecognized arguments,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30230490/

相关文章:

python - 更改 Django 管理员 list_display 中的可点击字段

python 不被识别为内部或外部命令

python - 在 django View 中执行阻塞请求

python - 如何使用 Python 将代码写入 .txt 文件?

mysql - syncdb后字段列表django中的未知列

django 脆皮表单标签覆盖不起作用

python - 为什么 'model' 对象不可迭代?

django - 在 Django admin 中按自定义日期范围过滤

python - 将事件绑定(bind)到 Python 中的变量

python - 格式化文件功能在不应该写入的情况下写入了不必要的 ","