经理不可用;用户已被替换为'pet.Person' [英] Manager isn't available; User has been swapped for 'pet.Person'

查看:180
本文介绍了经理不可用;用户已被替换为'pet.Person'的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在django中使用默认的用户模式是相当不错的,我意识到,如果我需要进一步增强它,我将不得不在django 1.5中创建自己的用户模型。



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



视图

  def LoginRequest(request):
form = LoginForm(request.POST或None)
如果request.user.is_authenticated():
username = User.objects.get(username = request.user)
url = reverse('world:Profile',kwargs = {'slug':person.slug})
return HttpResponseRedirect(url)
如果request.POST和表单。$ {$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ b 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})

型号



$ person $($)$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ b msg ='用户必须有一个电子邮件地址'
raise ValueError(msg)

如果不是用户名:
msg ='此用户名无效'
raise ValueError(msg)

如果不是date_of_birth:
msg ='请验证您的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
返回用户

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)
返回用户


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


解决方案

问题是用户 reefers到 django.contrib.auth.models.User ,现在你有一个自定义用户 假设你在 settings.py

  AUTH_USER_MODEL =pet.Person

您必须定义 自定义用户的用户,您可以使用 get_user_model 您使用的文件用户

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

现在,您将可以使用自定义用户模型,问题已经修复。


I'm been using the default user model in django for quite a abit and I realize , if I need to further enhance it , I would have to create my own custom User Model in django 1.5 .

I created my custom user model and I have a function which allows users to sign in . I think my custom user model is incompatible with my function because it wouldn't allow me to do request.user . How can I fix this so I can use request.user again?

views

 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})

models

 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

解决方案

The problem is that User reefers to django.contrib.auth.models.User and now you have got a Custom User pet.Person assuming you have in the settings.py

AUTH_USER_MODEL = "pet.Person"

you have to define User with the Custom User model and you can do this with get_user_model at the top of the file where you use User

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

now you will be able to use Custom User model and the problem has been fixed.

这篇关于经理不可用;用户已被替换为'pet.Person'的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆