use*_*694 5 python authentication django
我正在尝试在 Django 中使用电子邮件进行身份验证。换句话说,我正在扩展 django 身份验证。我遵循了所有步骤,相信我它以前是有效的。现在它停止工作了。
从 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'用户地址'
从模型导入 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 ,除非您更改了它。
只是一个想法。
| 归档时间: |
|
| 查看次数: |
1545 次 |
| 最近记录: |