在 Django 中创建自定义命令

Mel*_*art 5 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)
Run Code Online (Sandbox Code Playgroud)

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

我在相关应用程序中创建了一个管理包,并在其中添加了一个命令包,并在其中添加了一个文件 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)))
Run Code Online (Sandbox Code Playgroud)

我希望它像 createsuper 用户一样工作,提示我输入电子邮件、姓名和作品。但是当我运行它时,我得到以下信息,

TypeError: handle() got an unexpected keyword argument 'verbosity'
Run Code Online (Sandbox Code Playgroud)

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

Wil*_*sem 4

就像创建自定义命令的文档中指定的那样:

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

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

然而,您可以通过使用关键字参数轻松捕获并忽略它们:

class Command(BaseCommand):

    def handle(self, email, username=None, password=None, **other):
        # ...
        # perform actions
        pass
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

请注意,密码在 Django 中经过哈希处理,因此您应该使用create_user(..).