Looking for django Keywords? Try Ask4Keywords

Django 사용자 정의 사용자 모델 지정


Django에 내장 된 User 모델은 어떤 종류의 프로젝트에는 항상 적합한 것은 아닙니다. 일부 사이트에서는 예를 들어 사용자 이름 대신 전자 메일 주소를 사용하는 것이 더 적합 할 수 있습니다.

프로젝트 설정 파일의 AUTH_USER_MODEL 설정에 User 정의 된 User 모델을 추가하는 기본 User 모델을 재정의 할 수 있습니다.

AUTH_USER_MODEL = 'myapp.MyUser'

이 높게 만들 adviced있어합니다 AUTH_USER_MODEL 어떤 마이그레이션을 만들거나 실행하기 전에 manage.py migrate 처음. Django의 동적 종속성의 한계로 인해.

예를 들어 블로그에서 다른 사용자가 일반 사용자 이름 대신 이메일 주소로 로그인 할 수있게하려면 이메일 주소가 USERNAME_FIELD 맞춤 User 모델을 만듭니다.

from django.contrib.auth.models import AbstractBaseUser

class CustomUser(AbstractBaseUser):
     email = models.EmailField(unique=True)
     
     USERNAME_FIELD = 'email'

AbstractBaseUser 를 상속함으로써 우리는 호환되는 User 모델을 생성 할 수 있습니다. AbstractBaseUserUser 모델의 핵심 구현을 제공합니다.

Django manage.py createsuperuser 명령이 필요한 다른 필드를 알 수있게하기 위해 우리는 REQUIRED_FIELDS 지정할 수 있습니다. 이 값은 장고의 다른 부분에는 영향을 미치지 않습니다!

class CustomUser(AbstractBaseUser):
    ...
    first_name = models.CharField(max_length=254)
    last_name = models.CharField(max_length=254)
    ...
    REQUIRED_FIELDS = ['first_name', 'last_name']

Django의 다른 부분을 준수하려면 값 is_active , get_full_name()get_short_name() 을 여전히 지정해야합니다.

class CustomUser(AbstractBaseUser):
    ...
    is_active = models.BooleanField(default=False)
    ...
    def get_full_name(self):
        full_name = "{0} {1}".format(self.first_name, self.last_name)
        return full_name.strip()

    def get_short_name(self):
        return self.first_name

Django가 create_user()create_superuser() 함수를 사용할 수있게하는 User 모델 용 사용자 정의 UserManager 도 만들어야합니다.

from django.contrib.auth.models import BaseUserManager

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

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

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

    def create_superuser(self, email, first_name, last_name, password):
        user = self.create_user(
            email=email,
            first_name=first_name,
            last_name=last_name,
            password=password,
        )

        user.is_admin = True
        user.is_active = True
        user.save(using=self.db)
        return user