2017-10-20 96 views
0

我正尝试在Django中使用电子邮件进行身份验证。换句话说,我正在扩展django身份验证。我遵循了所有步骤,并相信我之前的工作。现在它停止工作。客户用户身份验证错误:AttributeError:管理器不可用; 'auth.User'已被换成'user_management.CustomUser'

这是model.py

 

    from django.db import models 
    from django.contrib.auth.models import AbstractBaseUser,BaseUserManager,PermissionsMixin 
    from django.core.mail import send_mail 
    from django.utils.translation import ugettext_lazy as _ 
    #now=time.strftime('%Y-%M-%D %H:%m:%S.%u%Z') 
    import datetime 
    from datetime import timedelta 

    from django.utils import timezone 
    from django.utils.timezone import now 


    tomorrow = timezone.now() + timedelta(days=1) 
    current_time= timezone.now() 

    class CustomUserManager(BaseUserManager): 
     def _create_user(self,email,password,is_staff,is_superuser, **extra_fields): 

      if not email: 
       raise ValueError('The given email must be set') 

      email=self.normalize_email(email) 
      user= self.model(email=email, 
          is_staff=is_staff, 
          is_active = True, 
          is_superuser =is_superuser, 
          last_login=timezone.now(), 
          date_joined=timezone.now(), 
          **extra_fields) 
      user.set_password(password) 
      user.save(using=self._db) 
      return user 

     def create_user(self, email,password=None,**extra_fields): 
      return self._create_user(email,password,False,False,**extra_fields) 

     def create_superuser(self, email,password,**extra_fields): 
      return self._create_user(email,password,True,True,**extra_fields) 

    class CustomUser(AbstractBaseUser,PermissionsMixin): 
     username =models.CharField(max_length =255, unique = True,blank = True,null= True) 
     email =models.EmailField(blank=False, unique =True) 
     date_joined = models.DateTimeField(_('date joined'), default=now) 
     is_active = models.BooleanField(default=True) 
     is_admin  = models.BooleanField(default=False) 
     is_staff  = models.BooleanField(default=False) 
     is_superuser = models.BooleanField(default=False) 

     USERNAME_FIELD ='email' 
     REQUIRED_FIELD =['user_name','date_joined'] 

     objects=CustomUserManager() 

     class Meta: 
      verbose_name=_('user') 
      verbose_name_plural=_('users') 

     def get_absolute_url(self): 
      return "/user/%s" %urlquote(self.email) 

     def get_full_name(self): 

      a=UserProfile.objects.get(email_id=self.id) 
      self.first_name=a.first_name 
      self.last_name= a.last_name 
      if not self.first_name and not self.last_name: 
       full_name =self.email 
      else: 
       full_name = '%s %s' %(self.first_name,self.last_name) 
      return full_name.strip() 

     def get_short_name(self): 
      self.first_name='a' 
      return self.first_name 

     def email_user(self,subject,message,from_email=None): 
      send_mail(subject,message,from_email,[self.email]) 


      #code 

    class UserProfile(models.Model): 

     email = models.OneToOneField(CustomUser,unique =True,primary_key=True) 
     first_name=models.CharField(max_length =256, blank = True) 
     last_name=models.CharField(max_length =256, blank = True) 
     activation_key = models.CharField(max_length=40,blank=True) 
     gender = models.CharField(max_length=6, null=True,blank=True,choices=(
      ('male', 'Male'), 
      ('female', 'Female'),)) 
     date_of_birth=models.DateField(null=True,blank=True) 
     key_expires = models.DateTimeField(default=tomorrow) 

     def __str__(self): 
      full_name = '%s %s' %(self.first_name,self.last_name) 
      return full_name 

     class Meta: 
      verbose_name=u'User profile' 
      verbose_name_plural=u'User profiles' 

     models.OneToOneField(CustomUser, related_name='Userprofile') 

    class UserAddress(models.Model): 
     address_contact=models.CharField(max_length=300,blank=False) 
     address_line1=models.CharField(max_length=300,blank=False) 
     address_line2=models.CharField(max_length=300,blank=True) 
     land_mark=models.CharField(max_length=100,blank=False) 
     city=models.CharField(max_length=140,blank=False) 
     state=models.CharField(max_length=100,blank=False) 
     pin_code = models.BigIntegerField(blank=False) 
     mobile_no=models.CharField(max_length=13,blank=True) 
     last_shipped_flag=models.BooleanField(default=False) 
     is_active_flag=models.BooleanField(default=True) 
     is_primary=models.BooleanField(default=False) 
     creation_date=models.DateTimeField(auto_now_add=True,editable=False,blank=False,null=True) 
     updation_date=models.DateTimeField(auto_now=True,editable=False,blank=False,null=True) 
     email=models.ForeignKey(UserProfile) 


     def __str__(self): 
      return self.address_contact 


     class Meta: 
      verbose_name=u'User Address' 
      verbose_name_plural=u'User Addresses' 

这是manager.py

 
from models import CustomUser 

class CustomUserAuth(object): 

    def authenticate(self, username = None, password =None): 
     try: 
      user =CustomUser.objects.get(email=username) 
      if user.check_password(password): 
       return user 
     except CustomUser.DoesNotExist: 
      return None 

    def get_user(self, user_id): 
     try: 
      user=CustomUser.objects.get(pk=user_id) 
      if user.is_active: 
       return user 
      return None 
     except CustomUser.DoesNotExist: 
      return None 



我已经包含在我的settings.py文件以下行

 

    AUTH_USER_MODEL = 'user_management.CustomUser' 

    AUTHENTICATION_BACKENDS = ('user_management.manager.CustomUserAuth',) 

现在进行故障排除我运行python manage.py shell并导入表格

CustomUserCreationForm并将数据传递给它并尝试保存它。 我得到了同样的错误

错误追溯

 

    Traceback (most recent call last): 
     File "", line 1, in 
     File "/usr/local/lib/python2.7/dist-packages/django/contrib/auth/forms.py", line 110, in save 
     user = super(UserCreationForm, self).save(commit=False) 
     File "/usr/local/lib/python2.7/dist-packages/django/forms/models.py", line 459, in save 
     if self.errors: 
     File "/usr/local/lib/python2.7/dist-packages/django/forms/forms.py", line 175, in errors 
     self.full_clean() 
     File "/usr/local/lib/python2.7/dist-packages/django/forms/forms.py", line 386, in full_clean 
     self._post_clean() 
     File "/usr/local/lib/python2.7/dist-packages/django/forms/models.py", line 413, in _post_clean 
     self.instance.full_clean(exclude=exclude, validate_unique=False) 
     File "/usr/local/lib/python2.7/dist-packages/django/db/models/base.py", line 1235, in full_clean 
     self.clean() 
     File "/usr/local/lib/python2.7/dist-packages/django/contrib/auth/models.py", line 349, in clean 
     self.email = self.__class__.objects.normalize_email(self.email) 
     File "/usr/local/lib/python2.7/dist-packages/django/db/models/manager.py", line 198, in __get__ 
     cls._meta.swapped, 
    AttributeError: Manager isn't available; 'auth.User' has been swapped for 'user_management.CustomUser' 

有关于下面的错误很多信息。我试图谷歌,但我发现一个错误在django 1.5票关闭。很少聪明人说我使用了get_user_model,但这些信息并不完整。

请帮

回答

0

不知道这是相关的或没有,但你在你的高清get_full_name(个体经营)正确地获取用户配置:这里有:

a=UserProfile.objects.get(email_id=self.id) 

但是我没有看到在您的类UserProfile中指定的email_id。你有指定的电子邮件,该类是从models.Model分类,默认情况下,我希望只有一个id列不email_id,除非你已经改变它。

只是一个想法。

+0

我自己修复了。我将CustomUser的get_user_model更改为Custom.UserCreationForm的Forms.py 类Meta: model = get_user_model() – user3698694