在django中创建自定义命令

时间:2018-05-25 21:19:15

标签: python django

我有以下用户模型,

class User(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(unique=True, max_length=255)
    mobile = PhoneNumberField(null=True)
    username = models.CharField(null=False, unique=True, max_length=255)
    full_name = models.CharField(max_length=255, blank=True, null=True)
    is_bot = models.BooleanField(default=False)

我想创建一个自定义命令,它可以像createsuperuser一样工作并创建一个bot。

我在相关应用程序中创建了一个管理包,并在其中添加了一个命令包和一个文件createbot.py。

这是我在createbot.py

中的代码
class Command(BaseCommand):
    def handle(self, email, username=None, password=None):
        user = User.objects.create(email,
                                   username=username,

                                   password=password,
                                   is_staff=True,
                                   is_superuser=True,
                                   is_active=True,
                                   is_bot=True
                                   )
        self.stdout.write(self.style.SUCCESS('Successfully create user bot with id: {}, email: {}'.format(user.id, user.email)))

我希望这个工作与createsuper用户完全一样,让我提示输入电子邮件,姓名和作品。 但是当我运行它时,我得到以下内容,

TypeError: handle() got an unexpected keyword argument 'verbosity'

我怎样才能让它发挥作用?

1 个答案:

答案 0 :(得分:2)

在创建custom commands的文档中指定了类似内容:

  

除了能够添加自定义命令行选项外,所有管理命令还可以接受一些默认选项,例如--verbosity--traceback

这意味着即使您对这些参数不感兴趣,也会使用这些参数调用handle(..)函数。

通过使用keyword arguments

,您可以轻松捕捉并忽略它们
class Command(BaseCommand):

    def handle(self, email, username=None, password=None, **other):
        # ...
        # perform actions
        pass

这里other是一个将字符串映射到值的字典:调用该函数的参数,但在函数签名中没有明确提到。

文档还提到了如何指定要在句柄中使用的参数,以便在用户请求如何使用自定义命令时生成帮助文本。你可以写一下:

class Command(BaseCommand):

    def add_arguments(self, parser):
        # Positional arguments
        parser.add_argument('email', required=True)

        # Named (optional) arguments
        parser.add_argument(
            '--username',
            help='The username for the user',
        )
        parser.add_argument(
            '--password',
            help='The password for the user',
        )

    def handle(self, email, username=None, password=None, **other):
        # ...
        # perform actions
        pass

请注意,Django中的密码是哈希,因此您应该使用create_user(..)