본문 바로가기
인터페이스 개발/Django

Django - 커스텀 유저 모델

by cooluk 2020. 10. 7.

커스텀 유저 모델

유저 모델

  • 장고 기본 모델 django.contrib.auth.models.User
  • 기존 모델 확장 또는 새로 정의

user 앱 만들기

  • python manage.py startapp user
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'user.UserConfig',
]

커스텀 유저 모델 만들기

  • AbstractUser 또는 AbstractBaseUser를 상속
  • 유저 모델의 기본 만을 제공
    • (예시 : 암호화된 비밀번호, 정규화된 이메일)
  • 유저 매니저 클래스 정의
    • 모델을 관리하는 클래스인 매니저 만들기
    • 모든 장고 모델은 Manager를 통하여 QuerySet을 받음
    • 기본 Manager는 모든 모델에 objects 라는 이름으로 존재
    • 장고가 유저 모델 관리를 위해 UserManager라는 매니저 클래스 제공
    • 만약 유저 모델이username, email, is_staff, is_active, is_superuser, last_login, date_joined 필드를 정의한다면 그냥 UserManager 사용 가능
    • 다른 필드들이 존재한다면 BaseUserManager를 상속해 매니저 클래스를 정의
    • 커스텀 매니저는 create_user, create_superuser 두 개의 메소드를 구현

user/models.py

class MyUserManager(BaseUserManager):
    def _create_user(self, email, password=None, **kwargs):
        if not email:
            raise ValueError('이메일은 필수입니다.')

        user = self.model(email=self.normalize_email(email), **kwargs)
        user.set_password(password)
        user.save(using=self._db)

    def create_user(self, email, password, **kwargs):
        """
        일반 유저 생성
        """
        kwargs.setdefault('is_admin', False)
        return self._create_user(email, password, **kwargs)

    def create_superuser(self, email, password, **kwargs):
        """
        관리자 유저 생성
        """
        kwargs.setdefault('is_admin', True)
        return self._create_user(email, password, **kwargs)

class MyUser(AbstractBaseUser):
    # 사용자 ID로 email을 사용
    email = models.EmailField(unique=True, verbose_name='이메일')
    name = models.CharField(max_length=20, verbose_name='이름')
    date_joined = models.DateTimeField(auto_now_add=True, verbose_name='가입일')
    is_active = models.BooleanField(default=True, verbose_name='활성화 여부')
    is_admin = models.BooleanField(default=False, verbose_name='관리자 여부')

    # 모델 매니저
    objects = MyUserManager()

    class Meta:
        db_table = 'users'
        verbose_name = '유저'
        verbose_name_plural = '유저들'

커스텀 유저 모델 설정

  • settings.py
    • AUTH_USER_MODEL = 'users.MyUser'
    • USERNAME_FIELD = 'email'
      • unique identifier (unique=True 옵션이 설정)
      • str 타입
    • REQUIRED_FIELDS = ['name']
      • 명령어로 관리자 계정 만들시 필수 요소 입력
      • USERNAME_FIELD와 password는 기본 필수 (지정하지 않아도 됨)

settigns.py

AUTH_USER_MODEL = 'users.MyUser'
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['name']

수퍼유저 만들기

$ python manage.py createsuperuser
이메일: asdf@asdf.com
이름: adsfasdf
Password:
superuser created successfully

댓글