1.5

2013-05-22 2 views
2

나는 사용자 이름으로 email 필드를 사용하는 장고 1.5 프로젝트에서 사용자 지정 사용자를 가지고 :1.5

class MyUser(AbstractUser): 
    my_custom_field = models.CharField(max_length=20, blank=True, null=True) 

    USERNAME_FIELD = 'email' 

MyUser._meta.get_field_by_name('email')[0]._unique = True 
MyUser.REQUIRED_FIELDS.remove('email') 

내가 지금처럼 해당 사용자 인증을 시도 할 경우 :

을 나는 사용자 지정 사용자를 인증 할 수 있다고 생각 할수 있습니까

Traceback: 
File "/Users/user/dev/proj/app/core/views.py" in post 
    39.    login(request, auth_user) 
File "/Users/user/.virtualenvs/proj/lib/python2.7/site-packages/django/contrib/auth/__init__.py" in login 
    92.  request.session[BACKEND_SESSION_KEY] = user.backend 
File "/Users/user/.virtualenvs/proj/lib/python2.7/site-packages/django/utils/functional.py" in inner 
    203.   return func(self._wrapped, *args) 

Exception Type: AttributeError at /signup 
Exception Value: 'AnonymousUser' object has no attribute 'backend' 

:

auth_user = authenticate(username=email, password=password) 
login(request, auth_user) 
나는이 얻을?

+0

나는 무엇을 의미 했는가? AUTHENTICATION_BACKENDS = ('django.contrib.auth.backends.ModelBackend') ' –

+0

'AUTH_USER_MODEL'을 (를) 설정 했습니까? –

+0

'authenticate'은 실제 사용자를 반환하지 않는 것처럼 보입니다. django.contrib.auth의 표준 방법입니까? 이메일과 비밀번호가 맞습니까? –

답변

4

내 맞춤 모델에 명백하게 요구되는 맞춤 관리자에 create_user()이 구현되지 않았습니다.

from django.contrib.auth.models import AbstractUser, BaseUserManager 

class MyUserManager(BaseUserManager): 
    def create_user(self, email, password=None): 
     if not email: 
      raise ValueError('Users must have an email address') 

     user = self.model(
      email=MyUserManager.normalize_email(email), 
     ) 

     user.set_password(password) 
     user.save(using=self._db) 
     return user 

    def create_superuser(self, email, password): 
     user = self.create_user(email, 
      password=password, 
     ) 
     user.is_admin = True 
     user.save(using=self._db) 
     return user 


class MyUser(AbstractUser): 
    some_custom_field = models.CharField(max_length=20, blank=True, null=True) 

    objects = MyUserManager() 

    USERNAME_FIELD = 'email' 

MyUser._meta.get_field_by_name('email')[0]._unique = True 
MyUser.REQUIRED_FIELDS.remove('email') 

장고 1.5 "사용자 정의 사용자"구현은 가증

여기에 전체 작업 코드입니다. 당신이 장고의 사용자 모델과 완전히 행복하고 방금 몇 가지 추가 프로필 정보를 추가하려면

1

무엇 장고 문서가 말하는 것은,

당신은 단순히 서브 클래스 django.contrib.auth.models.AbstractUser 수 및 사용자 정의 프로필 필드

그래서 AbstractUser의 아이디어는 당신이 장고 1.5 이전처럼 별도의 DB 테이블을 생성하지 않고 사용자 모델에 몇 가지 추가 필드를 추가해야 할 경우에만 사용하는 것입니다

를 추가합니다.

하지만 사용자 이름으로 이메일을 사용하는 것과 같은 다른 기능이 필요한 경우 더 나은 방법은 AbstractBaseUser 클래스를 확장하고 거기에 필요한 모든 필드를 설정하는 것입니다. USERNAME_FIELD='email'을 설정하면 사용자 정의 create_user() 메소드를 작성하지 않고도 작동합니다.