我正在尝试使用电子邮件在Django中进行身份验证。换句话说,我正在扩展django身份验证。我按照所有步骤,相信我之前的工作。现在它停止了工作。
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'
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
我在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,但这些信息不完整。
请帮忙
答案 0 :(得分:0)
不确定这是否相关,但是你是否正确地在你的def get_full_name(自我)中获得了UserProfile:你在这里:
a=UserProfile.objects.get(email_id=self.id)
但是我没有在您的Class UserProfile中看到指定的email_id。您已指定电子邮件,并且该类已从models.Model进行子类分类,默认情况下,我希望只有id列而不是email_id,除非您更改了它。
只是一个想法。