我想用电子邮件和用户名创建一个超级用户。我希望电子邮件成为一种优先于用户名的方式。
我决定更改内置用户。因此,我创建了2个类。第一类是UserManager(BaseUserManager)
,第二类是User(AbstractBaseUser)
回到问题所在,当我通过命令行创建超级用户时,它会创建一个用户,但会在用户名字段中放置一封电子邮件,并以与用户名相反的方式放置电子邮件。
这是我的模特。py
class UserManager(BaseUserManager):
def create_user(self, username, email, password=None, is_active=True, is_staff=False, is_admin=False):
user_obj = self.model(
email=self.normalize_email(email),
username=username
)
user_obj.set_password(password)
user_obj.staff = is_staff
user_obj.admin = is_admin
user_obj.active = is_active
user_obj.save(using=self._db)
return user_obj
def create_staffuser(self, email, password):
...
def create_superuser(self, username, email, password):
user = self.create_user(
email,
username,
password=password,
is_staff=True,
is_admin=True
)
return user
class User(AbstractBaseUser):
email = models.EmailField(
verbose_name = 'email address',
max_length=255,
unique=True
)
username = models.CharField(max_length=40, unique=True, verbose_name='username')
active = models.BooleanField(default=True)
staff = models.BooleanField(default=False)
admin = models.BooleanField(default=False)
USERNAME_FIELD= 'email'
REQUIRED_FIELDS = ['username',]
objects = UserManager()
为什么会弄乱用户名和电子邮件?
答案 0 :(得分:1)
是,您确实在UserManager
中定义:
def create_user(self, username, email, password=None, is_active=True, is_staff=False, is_admin=False):
# ...
但是稍后在代码中,您可以使用以下命令调用此函数:
def create_superuser(self, username, email, password):
user = self.create_user(
email,
username,
password=password,
is_staff=True,
is_admin=True
)
return user
因此,这里您调用create_user
方法,但是交换了username
和email
参数。因此,您需要交换对create_user
的调用中的参数。