2017-10-20 32 views
0

J'essaie d'utiliser l'email pour l'authenication dans Django. En d'autres termes, j'étend l'authentification django. J'ai suivi toutes les étapes et croyez-moi cela a fonctionné avant. Maintenant, il a cessé de fonctionner.Erreur d'authentification de l'utilisateur client: AttributeError: le gestionnaire n'est pas disponible; 'auth.User' a été échangé pour 'user_management.CustomUser'

c'est 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' 

c'est 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 



J'ai inclus les lignes suivantes dans mon fichier settings.py

 

    AUTH_USER_MODEL = 'user_management.CustomUser' 

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

maintenant pour le dépannage J'ai couru le shell python manage.py et j'importe le formulaire

CustomUserCreationForm et lui a transmis les données et a tenté de les enregistrer. Je obtenu la même erreur

trace d'erreur retour

 

    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' 

Il y a beaucoup d'informations à propos de l'erreur suivante. J'ai essayé de google mais j'ai trouvé un bug dans django 1.5 pour lequel le ticket est fermé. Peu de gens intelligents ont dit que j'ai utilisé get_user_model mais ces informations sont incomplètes.

S'il vous plaît aider

Répondre

0

Je ne sais pas si cela est pertinent ou non, mais vous obtenez le correctement UserProfile dans votre définition get_full_name (auto): Vous avez:

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

mais je ne vois pas email_id spécifié dans votre classe UserProfile. Vous avez un email spécifié et la classe est sous-classée à partir de models.Model qui, par défaut, je m'attendrais à avoir seulement une colonne id pas email_id sauf si vous l'avez changé.

Juste une idée.

+0

Je l'ai corrigé moi-même. Je l'ai changé get_user_model de CustomUser dans forms.py pour CustomUserCreationForm Classe Meta: model = get_user_model() – user3698694