2015-05-14 152 views
15

我试图创建一个类似于createsuperuser这将需要两个参数(用户名和密码)Django的自定义命令错误:无法识别参数

其在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 

的代码,当我尝试运行此命令

$ 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

回答

29

在Django 1.8,你应该add arguments给你的命令:

​​

add_argument()的​​方法是documented here

UPDATE:默认参数在options参数传递所以handle()方法应该是这样的:

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

而你并不需要检查args列表的长度 - 这是已通过​​完成。这是推荐的方法,但如果你想使用args参数,那么你必须使用“兼容模式”,并命名添加的参数为args

class Command(BaseCommand): 

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

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

阅读“改变在Django 1.8”旁注中文档的first chapter(紧接在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) 
+2

'蟒蛇manage.py createmysuperuser用户名密码为myuser mypasswd' 这个命令给出了这样的错误 '错误:无法识别的参数:密码mypasswd' – micheal

+0

我已经添加了'add_arguments'方法,就像在你的答案中一样,并且在这个下面的行中输入'012''' ''username,password = options ['username'],options ['password']' – micheal

+0

查看最新的答案。你应该像这样调用命令:'python manage.py createmysuperuser myuser mypasswd'。 – catavaran

相关问题