我在模型中使用CustomUser。这是用户管理器。
class UserManager(BaseUserManager):
def create_user(self, email, username, password=None, is_staff=False, is_superuser=False, is_active=False,
is_bot=False, is_mobile_verified=False, is_online=True, is_logged_in=True):
logger = logging.getLogger(__name__)
logger.info("REGULAR user created!")
if not email:
raise ValueError('Email is required')
if not username:
raise ValueError('Username is required.')
email = self.normalize_email(email)
user = self.model(email=email, username=username, is_staff=is_staff, is_superuser=is_superuser,
is_active=is_active, is_bot=is_bot, is_mobile_verified=is_mobile_verified,
is_online=is_online, is_logged_in=is_logged_in)
user.set_password(password)
user.save(using=self._db)
return user
def create_superuser(self, email, username, password):
logger = logging.getLogger(__name__)
logger.info("SUPER user created!")
return self.create_user(email, username, password=password, is_staff=True, is_superuser=True, is_active=True,
is_bot=False, is_mobile_verified=False, is_online=True, is_logged_in=True)
这是我对自定义用户模型的定义。
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)
birthday = models.DateField(null=True)
gender = models.CharField(max_length=255, null=True)
is_staff = models.BooleanField(default=False)
is_superuser = models.BooleanField(default=False)
is_active = models.BooleanField(default=False)
is_mobile_verified = models.BooleanField(default=False)
is_online = models.BooleanField(default=False)
is_logged_in = models.BooleanField(default=True)
is_bot = models.BooleanField(default=False)
location = models.ForeignKey(Location, on_delete=models.SET_NULL, null=True)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['username']
#objects = UserManager()
get_user_model().objects.create_user(...)
如果我取消注释行objects = UserManager()
,则可以运行服务器,但是从管理后端创建的超级用户无法登录。
如果我使用get_user_model()
,则代码会中断,并且出现以下错误
"AUTH_USER_MODEL refers to model '%s' that has not been installed" % settings.AUTH_USER_MODEL
django.core.exceptions.ImproperlyConfigured: AUTH_USER_MODEL refers to model 'bouncer.User' that has not been installed
但是在我的settings.py中,我定义了身份验证用户模型
AUTH_USER_MODEL = 'bouncer.User'
AUTHENTICATION_BACKENDS = (
'django.contrib.auth.backends.ModelBackend',
)
我在这里做什么错了?
答案 0 :(得分:4)
对于任何在2020年阅读此书的人,我怀疑问题与依赖性有关。我遇到了与OP相同的错误。
您的前两项检查应为:
1-您的installed apps
的{{1}}列表中的应用了吗?
2-{{1}}中是否设置了settings.py
?
这是我阅读过的大多数其他回复。
我在阅读文档时没有意识到,要使用AUTH_USER_MODEL = "app_name_from_apps_py.model_name"
,您需要先建立模型。当然可以吧!!
因此,在上面,OP在使用settings.py
的情况下,它们正在创建循环依赖项。
您不能在创建此模型的类中使用get_user_model()
。
答案 1 :(得分:1)
该错误似乎bouncer
中没有INSTALLED_APPS
。
因此要澄清,您必须
bouncer/models.py
包含User
模型(或models/__init__.py
从另一个文件导入模型)'bouncer'
列表中的INSTALLED_APPS
AUTH_USER_MODEL = 'bouncer.User'
(与您一样)。答案 2 :(得分:1)
确保您在admin.py中注册模型,而不是在models.py中注册
# admin.py
from django.contrib.auth.admin import UserAdmin
admin.site.register(YourUser, UserAdmin)
这为我解决了问题。
答案 3 :(得分:1)
切勿将自定义用户模型和包含用户模型链接的其他模型放在一个应用程序的一个 models.py 文件中。这可能是那个错误的问题。
导致该错误的坏主意:
# customUserModel/models.py
from django.contrib.auth.models import AbstractUser
from django.conf import settings
class User(AbstractUser):
pass
class Profile(models.Model):
user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
some_field = models.CharField(max_length=25)
这是个好主意:
# customUserModel/models.py
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
pass
# additionalUserProfile/models.py
from django.conf import settings
class Profile(models.Model):
user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
some_field = models.CharField(max_length=25)
#settings.py
AUTH_USER_MODEL = 'customUserModel.User'
答案 4 :(得分:0)
仅在导入后{em> 后尝试导入from django.db import models
答案 5 :(得分:0)
由于文件权限限制,也可能出现此问题。确保文件夹“ bouncer”已获得必要的权限
答案 6 :(得分:0)
尝试移动保镖应用程序在您的INSTALLED APPS
中的位置,这对我有用。
答案 7 :(得分:0)
就我而言,我不小心在自定义用户的 Meta
类中粘贴了属性 abstract = True
。所以它引发了这个错误。
答案 8 :(得分:0)
对我来说这是因为我有 myapp/models/__init__.py
并且我尝试将自定义 User
模型定义放在 myapp/models/user.py
中,并设置 AUTH_USER_MODEL = myapp.User
。将自定义 User
模型定义移动到 myapp/models/__init__.py
修复了它。我无法在 __init__.py
中导入它;我不得不将定义移到那里。
答案 9 :(得分:0)
由于某种原因,导入 from django.contrib.auth.backends import BaseBackend
导致了这个问题。我怀疑 BaseBackend 尝试使用用户模型,但不能,因为它是在文件的更下方定义的。但是,如果您在导入之前定义模型,那么它就可以正常工作。