客户用户身份验证错误:AttributeError:经理不可用;“auth.User”已替换为“user_management.CustomUser”

use*_*694 5 python authentication django

我正在尝试在 Django 中使用电子邮件进行身份验证。换句话说,我正在扩展 django 身份验证。我遵循了所有步骤,相信我它以前是有效的。现在它停止工作了。

这是模型.py

    从 django.db 导入模型
    从 django.contrib.auth.models 导入 AbstractBaseUser,BaseUserManager,PermissionsMixin
    从 django.core.mail 导入 send_mail
    从 django.utils.translation 导入 ugettext_lazy as _
    #now=time.strftime('%Y-%M-%D %H:%m:%S.%u%Z')
    导入日期时间
    从日期时间导入时间增量

    从 django.utils 导入时区
    立即从 django.utils.timezone 导入


    明天 = timezone.now() + timedelta(天=1)
    current_time=时区.now()

    类 CustomUserManager(BaseUserManager):
        def _create_user(自我,电子邮件,密码,is_staff,is_superuser,**额外_字段):

            如果没有电子邮件:
                raise ValueError('必须设置给定的电子邮件')

            电子邮件= self.normalize_email(电子邮件)
            用户= self.model(电子邮件=电子邮件,
                             is_staff=is_staff,
                             is_active = True,
                             is_superuser=is_superuser,
                             最后登录=时区.now(),
                             date_joined=timezone.now(),
                            **额外字段)
            用户.set_password(密码)
            user.save(using=self._db)
            返回用户

        def create_user(self, email,password=None,**extra_fields):
            返回 self._create_user(电子邮件、密码、False、False、**extra_fields)

        def create_superuser(自我、电子邮件、密码、**额外字段):
            返回 self._create_user(电子邮件、密码、True、True、**extra_fields)

    类 CustomUser(AbstractBaseUser,PermissionsMixin):
        用户名 =models.CharField(max_length =255, unique = True,blank = True,null= True)
        电子邮件=models.EmailField(空白=False,唯一=True)
        date_joined = models.DateTimeField(_('加入日期'), 默认=现在)
        is_active = models.BooleanField(默认=True)
        is_admin = models.BooleanField(默认=False)
        is_staff = models.BooleanField(默认=False)
        is_superuser = models.BooleanField(默认=False)

        USERNAME_FIELD ='电子邮件'
        REQUIRED_FIELD =['用户名','加入日期']

        对象=自定义用户管理器()

        类元:
            verbose_name=_('用户')
            verbose_name_plural=_('用户')

        def get_absolute_url(自身):
            返回“/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
            如果不是 self.first_name 且不是 self.last_name:
                全名=self.email
            别的:
                全名 = '%s %s' %(self.first_name,self.last_name)
            返回全名.strip()

        def get_short_name(self):
            self.first_name='a'
            返回 self.first_name

        def email_user(自我,主题,消息,from_email=无):
            send_mail(主题,消息,from_email,[self.email])


            #代码

    类 UserProfile(models.Model):

        电子邮件 = models.OneToOneField(CustomUser,unique =True,primary_key=True)
        first_name=models.CharField(max_length =256, 空白 = True)
        last_name=models.CharField(max_length =256, 空白 = True)
        activation_key = models.CharField(max_length=40,blank=True)
        性别 = models.CharField(max_length=6, null=True,blank=True,choices=(
            ('男', '男'),
            ('女', '女'),))
        date_of_birth=models.DateField(null=True,blank=True)
        key_expires = models.DateTimeField(默认=明天)

        def __str__(自身):
            全名 = '%s %s' %(self.first_name,self.last_name)
            返回全名

        类元:
            verbose_name=u'用户个人资料'
            verbose_name_plural=u'用户个人资料'

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

    类 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)
        城市=models.CharField(max_length=140,空白=False)
        状态=models.CharField(max_length=100,空白=False)
        pin_code = models.BigIntegerField(空白=False)
        mobile_no=models.CharField(max_length=13,空白=True)
        last_shipped_flag=models.BooleanField(默认=False)
        is_active_flag=models.BooleanField(默认=True)
        is_primary=models.BooleanField(默认=False)
        creation_date=models.DateTimeField(auto_now_add=True,editable=False,blank=False,null=True)
        update_date=models.DateTimeField(auto_now=True,editable=False,blank=False,null=True)
        email=models.ForeignKey(UserProfile)


        def __str__(自身):
            返回 self.address_contact


        类元:
            verbose_name=u'用户地址'
            verbose_name_plural=u'用户地址'

这是manager.py

从模型导入 CustomUser

类 CustomUserAuth(对象):

    def 验证(自我,用户名=无,密码=无):
        尝试:
            user =CustomUser.objects.get(电子邮件=用户名)
            如果用户.check_password(密码):
                返回用户
        除了 CustomUser.DoesNotExist:
            返回无

    def get_user(自身, user_id):
        尝试:
            user=CustomUser.objects.get(pk=user_id)
            如果用户.is_active:
                返回用户
            返回无
        除了 CustomUser.DoesNotExist:
            返回无



我在我的 settings.py 文件中包含了以下几行

    AUTH_USER_MODEL = '用户管理.自定义用户'

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

现在为了进行故障排除,我运行了 python manage.py shell 并导入了表单

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

错误回溯
 

    回溯(最近一次调用最后一次):
      文件“”,第 1 行,位于
      文件“/usr/local/lib/python2.7/dist-packages/django/contrib/auth/forms.py”,第 110 行,保存
        user = super(UserCreationForm, self).save(commit=False)
      文件“/usr/local/lib/python2.7/dist-packages/django/forms/models.py”,第 459 行,保存
        如果自我错误:
      文件“/usr/local/lib/python2.7/dist-packages/django/forms/forms.py”,第 175 行,出现错误
        self.full_clean()
      文件“/usr/local/lib/python2.7/dist-packages/django/forms/forms.py”,第 386 行,在 full_clean 中
        self._post_clean()
      文件“/usr/local/lib/python2.7/dist-packages/django/forms/models.py”,第 413 行,在 _post_clean 中
        self.instance.full_clean(排除=排除,validate_unique=False)
      文件“/usr/local/lib/python2.7/dist-packages/django/db/models/base.py”,第 1235 行,在 full_clean 中
        self.clean()
      文件“/usr/local/lib/python2.7/dist-packages/django/contrib/auth/models.py”,第 349 行,干净
        self.email = self.__class__.objects.normalize_email(self.email)
      文件“/usr/local/lib/python2.7/dist-packages/django/db/models/manager.py”,第 198 行,在 __get__ 中
        cls._meta.swapped,
    属性错误:管理器不可用;“auth.User”已替换为“user_management.CustomUser”

关于以下错误有很多信息。我尝试用 google 搜索,但发现 django 1.5 中存在一个错误,该错误的票证已关闭。很少有聪明人说我使用了 get_user_model 但这些信息不完整。

请帮忙

小智 0

不确定这是否相关,但您是否在 def get_full_name(self) 中正确获取了 UserProfile:这里您有:

a=UserProfile.objects.get(email_id=self.id)
Run Code Online (Sandbox Code Playgroud)

但是我没有看到您的类 UserProfile 中指定的 email_id 。您指定了电子邮件,并且该类是 models.Model 的子类,默认情况下,我希望只有一个 id 列而不是 email_id ,除非您更改了它。

只是一个想法。