当前位置: 首页 > 知识库问答 >
问题:

管理器不可用;用户已被替换为宠物。人的

李景天
2023-03-14

我已经在django中使用默认用户模型很久了,我意识到,如果我需要进一步增强它,我必须在django 1.5中创建自己的自定义用户模型。

我创建了我的自定义用户模型,我有一个允许用户登录的功能。我认为我的自定义用户模型与我的函数不兼容,因为它不允许我执行request.user。如何修复此问题,以便再次使用request.user?

意见

 def LoginRequest(request):
         form = LoginForm(request.POST or None)    
    if request.user.is_authenticated():
             username = User.objects.get(username=request.user)
             url = reverse('world:Profile', kwargs = {'slug': person.slug})
             return HttpResponseRedirect(url)       
         if request.POST and form.is_valid():

             user = form.authenticate_user()
             login(request, user)
            username= User.objects.get(username=request.user)
                person = Person.objects.get(user=request.user)
            url = reverse('world:Profile', kwargs = {'slug': person.slug})
             return HttpResponseRedirect(url)

    return render(request, 'login.html',{'form': form})

模型

 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

共有3个答案

喻嘉泽
2023-03-14

更新上述解决方案的重要注意事项。。。如果您面临这种问题,您可能已经尝试过各种web解决方案,告诉您将AUTH\u USER\u MODEL=users.CustomUser添加到settings.py中,然后将以下代码添加到views.pyforms.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等):

# Add the following import line
from django.contrib.auth import get_user_model

# Replace all references to User with get_user_model() such as...
user = get_user_model().objects.get(pk=uid)
# instead of  user = User.objects.get(pk=uid)
# or
queryset = get_user_model().objects.all()
# instead of queryset = User.objects.all()
# etc...

希望这能帮别人节省一些时间。。。

法烨烨
2023-03-14

对于可能遇到此问题的任何其他人,我也通过在forms.py上执行此操作来解决此问题:

将其添加到forms.py文件的顶部

from .models import YourCustomUser

然后将其添加到您的forms.pyCustomUser表单中:

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=(),但您必须有一个

慕容超
2023-03-14

问题是User指的是django.contrib.auth.models.User,现在您有了一个Custom User宠物。人假设你有在settings.py

AUTH_USER_MODEL = "pet.Person"

您必须使用自定义用户模型定义用户,您可以使用使用用户

from django.contrib.auth import get_user_model
User = get_user_model()

现在,您将能够使用自定义用户模型,问题已经解决。

 类似资料:
  • 我在Mongo4.4实例(Ubuntu)上创建了一个管理员用户 然后,我尝试,它告诉我我不是“大师”。我读了这篇文章,人们建议我做,但它不工作! 它给我以下错误: 我必须卸载MongoDB,重新安装,然后创建根用户,然后创建管理员用户吗?

  • 我对有问题: 应用程序启动时会显示警告: 警告7388---[main]组织。冬眠orm。弃用:HH90000014:发现使用弃用的[org.hibernate.id.SequenceHiLoGenerator]基于序列的id生成器;使用组织。冬眠id.enhanced。相反,SequenceStyleGenerator。有关详细信息,请参阅《Hibernate域模型映射指南》 我试图找出如何用新

  • 我从堆栈跟踪中找不到谁在调用 Android Studio版本:3.4 Gradle版本5.1.1

  • 这是最新版cPanel中引入的新功能。 通过此用户管理器部分,您可以使用单个界面控制cPanel中的所有用户。 此界面将显示所有用户帐户,他们拥有与您的域关联的电子邮件帐户或FTP帐户。 您可以删除编辑这些帐户,更改密码,也可以从此处删除它们。 此界面使您能够添加新用户并将其关联到FTP和电子邮件帐户。 删除帐户 要使用用户管理器并删除用户帐户,您可以按照以下步骤操作 - Step 1 - 单击左

  • 我在settings.py文件中包含了以下行 现在,为了进行故障排除,我运行python manage.py shell并导入表单 CustomUserCreationForm并将数据传递给它并尝试保存它。我也有同样的错误

  • 导语听说铁汁萌想找入门级练手项目,那小编今天就给大家带来一个背景替换实战小项目。刚入门学习深度学习的小伙伴,可以看一看~将 BackgroundMattingV2 项目稍微魔改了一下,让他在可以选择单一图片的基础上,可以把抠好的图片贴在自定义的背景图上,这样就可以让照片中的人物,出现在任何背景上。是不是很有意思?想领取更多完整源码跟Python学习资料可点击这行字体哦项目说明项目结构我们先看一下项目的结构,如图:其中,model文件夹放的是模型文件,模型文件的下载地址为: