经理不在;用户已被换为'pet.Person'

时间:2013-07-26 05:50:21

标签: django

我一直在使用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

5 个答案:

答案 0 :(得分:115)

问题在于,User引用了django.contrib.auth.models.User,现在假设您已进入Custom User

,您已获得pet.Person settings.py
AUTH_USER_MODEL = "pet.Person"

您必须使用User模型定义Custom User,并且可以使用get_user_model

文件顶部的User执行此操作
from django.contrib.auth import get_user_model
User = get_user_model()

现在您可以使用Custom User模型,问题已修复。

答案 1 :(得分:5)

对于其他可能遇到此问题的人,我也只需在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)

大笔记,请注意

  1. 此代码适用于我的情况。我有一个注册用户的视图,这里有一个问题,我已经解决了,我没有尝试过用于登录用户。

  2. include = ()部分是必需的,或者您可以添加exclude = (),但必须有一个

答案 2 :(得分:1)

重要的告诫,以更新上述解决方案... 如果您遇到此类问题,则可能已经在网络上尝试了各种解决方案,告诉您将AUTH_USER_MODEL = users.CustomUser添加到settings.py,然后将以下代码添加到views.py {{ 1}}和其他任何调用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

因为您知道已经将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

也许不直观,但是事实证明,在python中,在导入时执行一次get_user_model().objects.get() # without the need for User = get_user_model() anywhere 并不会导致在后续调用中定义User = get_user_model()(即,它不会变成{ {1}}转换为“常数”,如果您来自C / C ++背景,可能会期望它;这意味着User的执行在导入时发生,但随后被取消引用在随后对该文件中的类或函数/方法进行调用之前)。

总而言之,在所有引用User类的文件中(例如,调用函数或变量,例如User = get_user_model() User User.objects.get()等):< / p>

User.objects.all()

希望这有助于节省其他人的时间...

答案 3 :(得分:0)

在我的情况下,以上提供的所有解决方案均无效。如果您使用的是Django 3.1版,则还有另一种解决方案:

在auth / forms中,注释掉第10行,然后将第104和153行中的模型更改为您定义的模型。

答案 4 :(得分:0)

forms.py

from django.contrib.auth.models import User 更改为

from djangi.contrib.auth import get_user_model

然后在顶部添加以下代码

User = get_user_model()