2015-05-14 12 views
15

Sto cercando di creare un comando simile a createsuperuser che avrà due argomenti (username e password)Django errore di comando personalizzato: gli argomenti non riconosciuti

relativo funzionamento benissimo in Django 1.7 ma non in 1.8. (Sto usando anche python3.4)

Questo è il codice che ho scritto

frontend/gestione/comandi/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 

e quando provo a eseguire questo comando

$ python manage.py createmysuperuser myuser mypassword

ottengo questo errore

ma quando non passo alcun argomento solleva CommandError che è previsto.

CommandError: need exactly two arguments for username and password

risposta

29

In Django 1.8 si dovrebbe add arguments a te comando:

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

add_argument() metodo argparse è documented here.

UPDATE: Con argomenti di default sono passati nel parametro options modo che il metodo handle() dovrebbe assomigliare a questa:

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

e non avete bisogno di controllare la lunghezza della lista args - è già fatto da argparse. Questo è il metodo consigliato, ma se si desidera utilizzare l'argomento args poi si deve utilizzare la "modalità di compatibilità" e denominare l'argomento aggiunto come args:

class Command(BaseCommand): 

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

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

leggere il "Modificato nella Django 1.8" nota a margine in il first chapter dei documenti (subito dopo l'esempio closepoll.py).

UPDATE2: Ecco l'esempio di lavoro completo:

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

'python manage.py createmysuperuser nome utente la password myuser mypasswd' questo comando dà questo errore ' errore: argomenti non riconosciuti: la password mypasswd' – micheal

+0

I Ho aggiunto il metodo 'add_arguments' proprio come nella tua risposta e questa riga sotto al metodo' handle' 'username, password = opzioni ['username'], opzioni ['password']' sto sbagliando? – micheal

+0

Vedere la risposta aggiornata. Dovresti chiamare il comando come: 'python manage.py createmysuperuser myuser mypasswd'. – catavaran

Problemi correlati