Django自定义命令错误:无法识别的参数

时间:2015-05-14 06:12:16

标签: python django django-admin

我正在尝试创建一个类似于<AllowedOrigin>http://meteor.local</AllowedOrigin>的命令,它将采用两个参数(用户名和密码)

它在django 1.7中工作正常,但在1.8中没有。 (我也在使用python3.4)

这是我写的代码

MyApp的/管理/命令/ createmysuperuser.py

createsuperuser

当我尝试运行此命令时

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

2 个答案:

答案 0 :(得分:31)

在django 1.8中你应add arguments命令:

class Command(BaseCommand):
    ...
    def add_arguments(self, parser):
        parser.add_argument('username')
        parser.add_argument('password')
add_argument()的{​​{1}}方法是documented here

UPDATE :默认情况下,参数会在argparse参数中传递,因此options方法应如下所示:

handle()

您无需检查def handle(self, *args, **options): username = options['username'] password = options['password'] ... 列表的长度 - 它已由args完成。这是推荐的方法,但是如果要使用argparse参数,则必须使用“兼容模式”并将添加的参数命名为args

args

阅读文档first chapter中的“更改Django 1.8”旁注(在class Command(BaseCommand): def add_arguments(self, parser): parser.add_argument('args') def handle(self, *args, **options): if len(args) != 2: ... 示例之后)。

UPDATE2 :以下是完整的工作示例:

closepoll.py

答案 1 :(得分:2)

要进行最小的更改,只需在Command类中添加方法add_arguments()

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

您可以像以前一样继续使用args