我对高级 Django 以及使用 Django 4.2 和 PostGreSql 9.5 与 PgAdmin4 相当陌生。我正在尝试创建一个网站,用户可以在其中使用电子邮件和密码登录。我创建了这样的模型:
class Users(AbstractBaseUser):
id = models.UUIDField(primary_key=True, unique=True, default=uuid.uuid4, editable=False)
email = models.EmailField(db_index=True, unique=True, max_length=250, blank=True, null=True)
is_email_verified = models.BooleanField(default=False, help_text='this designates if the user\' email is verified')
is_active = models.BooleanField(default=True, help_text='this designates if the user is active')
is_staff = models.BooleanField(default=False, help_text='this designates if the user is staff or not')
password = models.CharField(max_length=200, verbose_name='password of user')
is_superuser = models.BooleanField(default=False, help_text='this designates if the user is superuser or not')
last_login = models.DateTimeField(verbose_name='Last login of user', auto_now_add=True)
created_time = models.DateTimeField(auto_now_add=True, verbose_name='Time user was created')
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = []
class Meta:
unique_together = ['id', 'email']
objects = UserManager()
我的用户管理类是这样的:
class UserManager(BaseUserManager):
def _create_user(self, email, password=None, **kwargs):
if not email:
raise ValueError('Email must be provided')
user = self.model(
email = self.normalize_email(email),
**kwargs
)
user.set_password(password)
user.save(using=self._db)
return user
def create_user(self, email, password=None, **kwargs):
kwargs.setdefault('is_active', True)
kwargs.setdefault('is_superuser', False)
kwargs.setdefault('is_staff', False)
user = self.model(
email=self.normalize_email(email),
password=password,
**kwargs
)
user.save()
return self._create_user(email, password, **kwargs)
def create_superuser(self, email, password=None, **kwargs):
kwargs.setdefault('is_active', True)
kwargs.setdefault('is_staff', True)
kwargs.setdefault('is_superuser', True)
user = self.model(
email=self.normalize_email(email),
password=password,
**kwargs
)
user.save()
return self._create_user(email, password, **kwargs)
有人告诉我,如果我想验证电子邮件而不是用户名,我应该创建一个自定义后端。我的自定义后端看起来像这样:
后端.py
class CaseSensitiveModelBackend(ModelBackend):
def authenticate(self, request, username, password, **kwargs):
UserModel = get_user_model()
if not username:
username = kwargs.get(UserModel.USERNAME_FIELD)
try:
case_insensitive_username_field = '{}__iexact'.format(UserModel.USERNAME_FIELD)
user = UserModel._default_manager.get(**{case_insensitive_username_field: username})
success = user.check_password(password)
if success:
return user
except UserModel.DoesNotExist:
return None
def get_user(self, user_id):
return
然而在创建迁移和迁移之后,当我尝试创建一个超级用户时,它告诉我超级用户已经存在,即使数据库是一个新的并且里面什么都不存在,同时仍然抛出这个错误:
django.db.utils.IntegrityError: duplicate key value violates unique constraint "bloggers_users_email_key" DETAIL: Key (email)=([email protected]) already exists.
此错误在用户已保存到数据库后立即出现
我也试过用所谓的已保存用户登录到管理员,但它抛出了一个区分大小写的错误。
我很困惑,请谁能帮我理解吗?