Django 经理是';t可用;用户已被换为';宠物人';
我在django中使用默认用户模型已经有一段时间了,我意识到,如果需要进一步增强它,我必须在django 1.5中创建自己的自定义用户模型 我创建了我的自定义用户模型,我有一个允许用户登录的功能。 我认为我的自定义用户模型与我的函数不兼容,因为它不允许我执行request.user。如何修复此问题,以便再次使用request.user 观点 模型Django 经理是';t可用;用户已被换为';宠物人';,django,Django,我在django中使用默认用户模型已经有一段时间了,我意识到,如果需要进一步增强它,我必须在django 1.5中创建自己的自定义用户模型 我创建了我的自定义用户模型,我有一个允许用户登录的功能。 我认为我的自定义用户模型与我的函数不兼容,因为它不允许我执行request.user。如何修复此问题,以便再次使用request.user 观点 模型 class PersonManager(BaseUserManager): def create_user(self, email,dat
class PersonManager(BaseUserManager):
def create_user(self, email,date_of_birth, username,password=None,):
if not email:
msg = 'Users must have an email address'
raise ValueError(msg)
if not username:
msg = 'This username is not valid'
raise ValueError(msg)
if not date_of_birth:
msg = 'Please Verify Your DOB'
raise ValueError(msg)
user = self.model(
email=PersonManager.normalize_email(email),username=username,date_of_birth=date_of_birth)
user.set_password(password)
user.save(using=self._db)
return user
def create_superuser(self,email,username,password,date_of_birth):
user = self.create_user(email,password=password,username=username,date_of_birth=date_of_birth)
user.is_admin = True
user.is_staff = True
user.is_superuser = True
user.save(using=self._db)
return user
class Person(AbstractBaseUser, PermissionsMixin):
email = models.EmailField(verbose_name='email address',max_length=255,unique=True,db_index=True,)
username = models.CharField(max_length=255, unique=True)
date_of_birth = models.DateField()
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['username', 'date_of_birth',]
is_active = models.BooleanField(default=True)
is_admin = models.BooleanField(default=False)
is_staff = models.BooleanField(default=False)
objects = PersonManager()
def get_full_name(self):
return self.email
def get_short_name(self):
return self.email
def __unicode__(self):
return self.email
问题是,
User
引用了django.contrib.auth.models.User
,现在您有了一个自定义用户
pet.Person
,假设您在settings.py
AUTH_USER_MODEL = "pet.Person"
您必须使用自定义用户
模型定义用户
,您可以使用使用用户
from django.contrib.auth import get_user_model
User = get_user_model()
现在,您将能够使用
自定义用户
模型,问题已得到解决。对于可能遇到此问题的任何其他人,我也通过在forms.py上执行此操作来解决此问题:
将其添加到forms.py文件的顶部
from .models import YourCustomUser
然后将其添加到forms.py CustomUser
表单:
class SignUpForm(UserCreationForm):
#profile_year = blaaa blaa blaaa irrelevant.. You have your own stuff here don't worry about it
# here is the important part.. add a class Meta-
class Meta:
model = YourCustomUser #this is the "YourCustomUser" that you imported at the top of the file
fields = ('username', 'password1', 'password2', #etc etc, other fields you want displayed on the form)
大音符,注意:
include=()
部分是必需的,或者您可以添加exclude=()
,但您必须有一个更新上述解决方案的重要注意事项。。。 如果您面临这种问题,您可能已经尝试过各种web解决方案,告诉您将
AUTH\u USER\u MODEL=users.CustomUser
添加到settings.py
中,然后将以下代码添加到views.py
forms.py
和调用USER
的任何其他文件中:
from django.contrib.auth import get_user_model
User = get_user_model()
当你发现错误时,你会搔头:
Manager isn't available; 'auth.User' has been swapped for 'users.User'
只要代码引用用户,例如:
User.objects.get()
因为您知道您已经将objects=UserManager()
放在自定义用户类中(UserManager
是扩展BaseUserManager
的自定义管理器的名称)
事实证明,它在做:
User = get_user_model() # somewhere at the top of your .py file
# followed by
User.objects.get() # in a function/method of that same file
不等同于:
get_user_model().objects.get() # without the need for User = get_user_model() anywhere
也许不直观,但事实证明,在python中,在导入时执行一次User=get\u User\u model()
不会导致在后续调用中定义User
(即,它不会将User
转换为“常量”如果您来自C/C++背景,您可能会想到的种类;这意味着User=get\u User\u model()
的执行发生在导入时,但随后在该文件中调用类或函数/方法之前被取消引用)
总之,在引用User
类的所有文件中(例如调用函数或变量,如User.objects.get()
User.objects.all()
User.DoesNotExist
等):
希望这能帮助其他人节省一些时间…以上提供的所有解决方案在我的情况下都不起作用。如果您使用Django 3.1版,则有另一种解决方案:
在auth/forms中,注释掉第10行,并将第104和153行中的模型更改为您定义的模型。在
forms.py
AUTH_USER_MODEL = "pet.Person"
将从django.contrib.auth.models导入用户更改为
from djangi.contrib.auth import get_user_model
然后在顶部添加以下代码
User = get_user_model()
您好,这看起来可以解决我的问题-我想知道代码应该放在哪个文件中?谢谢@GershomMaes AUTH_USER_MODEL inside settings.py和视图中的其他代码,或者无论您在何处使用该用户模型,我们都欢迎您:非常感谢!如果您正在文档中查找此信息:可能这与此问题无关,我只想注意相同的错误消息。在Django 3.0.4中,我使用了.UserChangeForm的contrib.auth.forms.UserCreationForm,它们的元类中都有model=User硬编码(而不是=UserModel,该文件中的UserModel等于get_User_model()。我做了PR,但我不知道替换用户->用户模型是否正确,Django项目中有许多PR正在等待。警告:您应该使用设置的状态。AUTH\u User\u MODEL
或get\u User\u MODEL()
而不是此方法。我不确定这是否只是一个惯例,或者是否存在安全问题。
User = get_user_model()