我有以下用户模型,
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)
我怎样才能让它发挥作用?
就像创建自定义命令的文档中指定的那样:
除了能够添加自定义命令行选项之外,所有管理命令都可以接受一些默认选项,例如
--verbosity和--traceback。
因此,这意味着handle(..)即使您对这些参数不感兴趣,也会使用这些参数调用该函数。
然而,您可以通过使用关键字参数轻松捕获并忽略它们:
class Command(BaseCommand):
def handle(self, email, username=None, password=None, **other):
# ...
# perform actions
passRun 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
passRun Code Online (Sandbox Code Playgroud)
请注意,密码在 Django 中经过哈希处理,因此您应该使用create_user(..).
| 归档时间: |
|
| 查看次数: |
1734 次 |
| 最近记录: |