如何从Django中已经从AbstractBaseUser继承的类中固有



我正试图从已经从AbstractBaseUser继承的User类进行继承,但我收到一个错误,告诉我AUTH_User_MODEL指的是模型的身份验证。尚未安装的用户",并且我确信我添加了AUTH_User_MODEL="身份验证"。User'在settings.py中,我想知道我如何才能克服这个错误并成功地从User类中固有这是代码:

from time import timezone
from django.contrib.auth.base_user import BaseUserManager, AbstractBaseUser
from django.contrib.auth.models import PermissionsMixin
from django.db import models

class ResidentType(models.TextChoices):
Family = ('FM', 'Family')
Individual = ('IV', 'Individual')

class UserManager(BaseUserManager):
def create_user(self, username, first_name, last_name, email, password=None):
if username is None:
raise TypeError('User must have a username')
if email is None:
raise TypeError('User must have an Email')
if first_name is None:
raise TypeError('User must have a first_name')
if last_name is None:
raise TypeError('User must have a last_name')
user = self.model(username=username, first_name=first_name, last_name=last_name,
email=self.normalize_email(email), )
user.set_password(password)
user.save()
return user
def create_admin(self, username, first_name, last_name, email, password=None):
if username is None:
raise TypeError('User must have a username')
if email is None:
raise TypeError('User must have an Email')
if first_name is None:
raise TypeError('User must have a first_name')
if last_name is None:
raise TypeError('User must have a last_name')
admin = self.model(username=username, first_name=first_name, last_name=last_name,
email=self.normalize_email(email), )
admin.set_password(password)
Admin.admin = True
Admin.is_active = True
admin.save()
return admin
def create_syndic(self, username, first_name, last_name, email):
password = User.objects.make_random_password()
if username is None:
raise TypeError('User must have a username')
if email is None:
raise TypeError('User must have an Email')
if first_name is None:
raise TypeError('User must have a first_name')
if last_name is None:
raise TypeError('User must have a last_name')
syndic = self.model(username=username, first_name=first_name, last_name=last_name,
email=self.normalize_email(email), )
syndic.set_password(password)
Syndic.admin = True
Syndic.staff = True
Syndic.is_active = True
syndic.save()
return
def create_resident(self, username, first_name, last_name, email, password=None):
if username is None:
raise TypeError('User must have a username')
if email is None:
raise TypeError('User must have an Email')
if first_name is None:
raise TypeError('User must have a first_name')
if last_name is None:
raise TypeError('User must have a last_name')
resident = self.model(username=username, first_name=first_name, last_name=last_name,
email=self.normalize_email(email), )
resident.set_password(password)
Resident.admin = False
Resident.staff = False
Resident.is_active = False
resident.save()
return resident

class User(AbstractBaseUser, PermissionsMixin):
username = models.CharField(max_length=255, unique=True, db_index=True)
first_name = models.CharField(max_length=255, db_index=True)
last_name = models.CharField(max_length=255, db_index=True)
email = models.EmailField(max_length=255, unique=True, db_index=True)
password = models.CharField(max_length=255, db_index=True)
is_active = models.BooleanField(default=False)
staff = models.BooleanField(default=False)
admin = models.BooleanField(default=False)
objects = UserManager()
def __str__(self):
return self.email
def has_module_perms(self, app_label):
return True
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = []
def get_full_name(self):
return self.email
def get_short_name(self):
return self.email
def has_perm(self, perm, obj=None):
return True
@property
def is_staff(self):
return self.staff
@property
def is_admin(self):
return self.admin

class Meta:
abstract = True

class Admin(User):
pass

class Syndic(User):
admin = models.ForeignKey(Admin, on_delete=models.CASCADE)

class Resident(User):
pass
type = models.CharField(max_length=2, choices=ResidentType, default=ResidentType.Family)
syndic = models.ForeignKey(Syndic, on_delete=models.CASCADE)

我认为问题在于将自定义用户模型作为抽象模型。

请重新检查、核实和确认。

对于以后会遇到这种情况的人,我已经通过使用代理模型而不是使用抽象类解决了这个问题,您也可以从User类中创建一个一对一字段,并将其用于其他类,或者您可以简单地在User模型中创建角色属性,而不是为其创建其他模型,并跟踪您创建的每个视图中的角色。

最新更新