【问题标题】:Customer User Authentication error : AttributeError: Manager isn't available; 'auth.User' has been swapped for 'user_management.CustomUser'客户用户身份验证错误:AttributeError:经理不可用; 'auth.User' 已替换为 'user_management.CustomUser'
【发布时间】:2018-04-01 21:30:37
【问题描述】:

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

这是model.py

从 django.db 导入模型 从 django.contrib.auth.models 导入 AbstractBaseUser,BaseUserManager,PermissionsMixin 从 django.core.mail 导入 send_mail 从 django.utils.translation 导入 ugettext_lazy 作为 _ #now=time.strftime('%Y-%M-%D %H:%m:%S.%u%Z') 导入日期时间 从日期时间导入时间增量 从 django.utils 导入时区 现在从 django.utils.timezone 导入 明天 = timezone.now() + timedelta(days=1) current_time=timezone.now() 类 CustomUserManager(BaseUserManager): def _create_user(self,email,password,is_staff,is_superuser, **extra_fields): 如果不是电子邮件: raise ValueError('必须设置给定的电子邮件') 电子邮件=self.normalize_email(电子邮件) 用户= self.model(电子邮件=电子邮件, is_staff=is_staff, is_active = 真, is_superuser =is_superuser, last_login=timezone.now(), date_joined=timezone.now(), **额外字段) user.set_password(密码) user.save(使用=self._db) 返回用户 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) 类 CustomUser(AbstractBaseUser,PermissionsMixin): 用户名 =models.CharField(max_length =255, unique = True,blank = True,null= True) 电子邮件=models.EmailField(空白=假,唯一=真) date_joined = models.DateTimeField(_('加入日期'), 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 ='电子邮件' REQUIRED_FIELD =['user_name','date_joined'] 对象=CustomUserManager() 元类: 详细名称=_('用户') verbose_name_plural=_('用户') def get_absolute_url(self): 返回 "/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) 返回 full_name.strip() def get_short_name(self): self.first_name='a' 返回 self.first_name def email_user(self,subject,message,from_email=None): send_mail(主题,消息,from_email,[self.email]) #代码 类用户配置文件(模型。模型): email = 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__(self): 全名 = '%s %s' %(self.first_name,self.last_name) 返回全名 元类: verbose_name=u'用户资料' verbose_name_plural=u'用户资料' models.OneToOneField(CustomUser,related_name='Userprofile') 类用户地址(模型。模型): 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(空白=假) mobile_no=models.CharField(max_length=13,blank=True) last_shipped_flag=models.BooleanField(default=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): 返回 self.address_contact 元类: verbose_name=u'用户地址' verbose_name_plural=u'用户地址'

这是 manager.py 从模型导入 CustomUser 类 CustomUserAuth(对象): def 验证(自我,用户名 = 无,密码 = 无): 尝试: 用户 =CustomUser.objects.get(email=username) 如果 user.check_password(密码): 返回用户 除了 CustomUser.DoesNotExist: 返回无 def get_user(self, user_id): 尝试: 用户=CustomUser.objects.get(pk=user_id) 如果 user.is_active: 返回用户 返回无 除了 CustomUser.DoesNotExist: 返回无

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

AUTH_USER_MODEL = 'user_management.CustomUser' 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 行,保存 如果 self.errors: 文件“/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() _post_clean 中的文件“/usr/local/lib/python2.7/dist-packages/django/forms/models.py”,第 413 行 self.instance.full_clean(exclude=exclude, validate_unique=False) 文件“/usr/local/lib/python2.7/dist-packages/django/db/models/base.py”,第 1235 行,在 full_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, AttributeError:经理不可用; 'auth.User' 已替换为 'user_management.CustomUser'

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

请帮忙

【问题讨论】:

标签: python django authentication


【解决方案1】:

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

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

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

只是一个想法。

【讨论】:

  • 我自己修好了。我将它的 get_user_model 从 Forms.py 中的 CustomUser 更改为 CustomUserCreationForm Class Meta: model = get_user_model()
  • @user3698694 如果您找到了准确的解决方法,请将其添加为答案,如果您认为没有帮助,请将其删除
猜你喜欢
  • 2018-03-19
  • 2021-12-24
  • 2019-07-20
  • 2018-07-27
  • 2020-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-15
相关资源
最近更新 更多