2015-05-14 153 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

相關問題