python - español - django tutorial
Error del comando personalizado de Django: argumentos no reconocidos (2)
En django 1.8 debes agregar argumentos a tu comando:
class Command(BaseCommand):
...
def add_arguments(self, parser):
parser.add_argument(''username'')
parser.add_argument(''password'')
add_argument()
método add_argument()
de argparse
se documenta aquí .
ACTUALIZACIÓN : de forma predeterminada, los argumentos se pasan en el parámetro options
, por lo que el método handle()
debería tener este aspecto:
def handle(self, *args, **options):
username = options[''username'']
password = options[''password'']
...
Y no es necesario que compruebe la longitud de la lista de argparse
ya que se realiza mediante argparse
. Este es el método recomendado, pero si desea usar el argumento args
, debe usar el "modo de compatibilidad" y nombrar el argumento agregado como args
:
class Command(BaseCommand):
def add_arguments(self, parser):
parser.add_argument(''args'')
def handle(self, *args, **options):
if len(args) != 2:
...
Lea la nota lateral "Cambiado en Django 1.8" en el primer capítulo de la documentación (justo después del ejemplo closepoll.py
).
ACTUALIZACIÓN2 : Aquí está el ejemplo completo de trabajo:
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)
Estoy intentando crear un comando similar a createsuperuser
que tomará dos argumentos (nombre de usuario y contraseña)
Está funcionando bien en Django 1.7 pero no en 1.8. (También estoy usando python3.4)
este es el codigo que escribi
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
y cuando intento ejecutar este comando
$ python manage.py createmysuperuser myuser mypassword
Me sale este error
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
pero cuando no paso ningún argumento, se genera CommandError
que se espera.
CommandError: need exactly two arguments for username and password
Para cambios mínimos, simplemente agregue el método add_arguments()
en la clase de Comando.
def add_arguments(self, parser):
parser.add_argument(''args'', nargs=''*'')
Puedes seguir usando args
como antes.