我想在Django中使用电子邮件进行身份验证 . 换句话说,我正在扩展django身份验证 . 我按照所有步骤,相信我之前的工作 . 现在它停止了工作 .
这是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'
这是来自模型导入CustomUser的manager.py.
class CustomUserAuth(object):
def authenticate(self,username = None,password = None):
尝试:
user = CustomUser.objects.get(email = username)
if user.check_password(密码):
返回用户
除CustomUser.DoesNotExist:
返回无
def get_user(self,user_id):
尝试:
用户= CustomUser.objects.get(PK = USER_ID)
if user.is_active:
返回用户
返回无
除CustomUser.DoesNotExist:
返回无
我在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,但这些信息不完整 .
请帮忙
1 回答
不确定这是否相关,但是你是否在def get_full_name(self)中正确获取了UserProfile:在这里你有:
但是我没有在您的Class UserProfile中看到指定的email_id . 您已指定电子邮件,并且该类已从models.Model进行子类分类,默认情况下,我希望只有id列而不是email_id,除非您已更改它 .
只是一个想法 .