Django自定义命令错误:无法识别的参数 [英] Django custom command error: unrecognized arguments

查看:75
本文介绍了Django自定义命令错误:无法识别的参数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试创建类似于 createsuperuser 的命令,该命令将使用两个参数(用户名和密码)

I'm trying to create a command similar to createsuperuser which will take two arguments (username and password)

在django 1.7中工作正常,但在1.8中却不能。 (我也在使用python3.4)

Its working fine in django 1.7 but not in 1.8. (I'm also using 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

but when I dont pass any arguments it raises CommandError which is expected.

CommandError:恰好需要两个参数作为用户名和密码

推荐答案

在Django 1.8中,您应该向您的命令添加参数

In django 1.8 you should add arguments to you command:

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

add_argument()方法的 argparse 在此处记录

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

UPDATE: By default arguments are passed in the options parameter so the handle() method should look like this:

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

并且您不需要检查 args 列表的长度- argparse 。这是推荐的方法,但是如果要使用 args 参数,则必须使用兼容模式并将添加的参数命名为 args

And you don't need to check the length of the args list - it is already done by argparse. This is the recommended method but if you want to use the args argument then you have to use the "compatibility mode" and name the added argument as args:

class Command(BaseCommand):

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

    def handle(self, *args, **options):
        if len(args) != 2:
            ...

阅读文档的第一章(在 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)

这篇关于Django自定义命令错误:无法识别的参数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆