创建超级用户时,它会将电子邮件放入用户名,而使用相反的方式

时间:2018-07-24 12:43:31

标签: django django-models

我想用电子邮件和用户名创建一个超级用户。我希望电子邮件成为一种优先于用户名的方式。

我决定更改内置用户。因此,我创建了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()

为什么会弄乱用户名和电子邮件?

1 个答案:

答案 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方法,但是交换了usernameemail参数。因此,您需要交换对create_user的调用中的参数。