我有以下用户模型,
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'
我怎样才能让它发挥作用?
答案 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(..)
。