django 커스텀 유저모델

ddwwmm_1·2022년 7월 12일

django

목록 보기
1/2
post-thumbnail

django의 경우 기본적으로 유저모델을 제공하고 있습니다.
하지만 원하는 로그인 방식이나 유저정보를 추가하여 사용하기 위해서 커스텀 모델을 사용할수도 있습니다.

우선 프로젝트를 실행하여 기본으로 주어지는 유저모델을 확인해봅니다.

# 프로젝트 실행
python manage.py runserver 

그전에 admin page 에 들어가기 위해선 admin계정(superuser)을 생성하여야 합니다.

# create superuser
python manage.py createsuperuser

admin 계정 생성후
http://127.0.0.1:8000/admin 에서
방금 생성한 id, password 입력후 접속합니다.

기본적으로 유저모델이 생성되어 있는걸 확인할 수 있습니다.
하지만 기존의 모델은 사용하지 않을것이기에 admin page 에서 보이지 않도록 합니다.

다시 vscode로 돌아가서 user app을 생성해줍니다.

# create app
# 앱 생성시 이름은 사용자정의 가능
python manage.py startapp user


터미널에서 실행하고 나면 user 라는 폴더와 파일들이 생성된것을 확인할 수 있습니다.

그리고 생성된 user 앱을 settings.py INSATALLED_APPS 에 등록해주고

# AUTH_USER_MODEL ='{생성한 app 이름}.{models.py 에서 생성한 유저 클래스 명}' 
AUTH_USER_MODEL = 'user.User'

위에 코드도 같이 등록해줍니다.

(저는 사용할 커스텀 클래스를 User 로 만들기로 하였기에 먼저 편의상AUTH_USER_MODEL 을 설정했습니다. 다른 이름으로 사용하고자 한다면 models.py 에서 유저모델을 생성한 후 그 유저 클래스명을 등록하면 됩니다.)

이제 커스텀 유저 모델을 만들기 위해 models.py 로 이동합니다.
커스텀 유저모델을 만들기 위해서는 2가지(BaseUserManager, AbstractBaseUser) 클래스가 필요합니다.

BaseUserManager 클래스는 유저를 생성할 때 사용하는 헬퍼(Helper) 클래스이며, 실제 유저모델(Model)은 AbstractBaseUser을 상속받아 생성합니다.

from django.db import models
# 커스텀 유저모델이 상속할 클래스 import
from django.contrib.auth.models import (BaseUserManager, AbstractBaseUser)


# 유저 생성시 사용
class UserManager(BaseUserManager):
    def create_user(self, username, password=None):
        if not username:
            raise ValueError('Users must have an username')
        user = self.model(
            username=username,
        )
        user.set_password(password)
        user.save(using=self._db)
        return user
    
    # python manage.py createsuperuser 사용 시 해당 함수가 사용됨
    def create_superuser(self, username, password, ):
        user = self.create_user(
            username=username,
            password=password,
        )
        user.is_admin = True
        user.save(using=self._db)
        return user
# 유저 모델
class User(AbstractBaseUser):
    username = models.CharField("사용자 계정", max_length=20, unique=True)
    email = models.EmailField("이메일 주소", max_length=100)
    password = models.CharField("비밀번호", max_length=200)
    fullname = models.CharField("이름", max_length=20)
    join_date = models.DateTimeField("가입일", auto_now_add=True)

	# is_active가 False일 경우 계정이 비활성화
    is_active = models.BooleanField(default=True) 

    # is_staff에서 해당 값 사용
    is_admin = models.BooleanField(default=False)
    
    # id로 사용 할 필드 지정.
    # 로그인 시 USERNAME_FIELD에 설정 된 필드와 password가 사용된다.
    USERNAME_FIELD = 'username'

    # user를 생성할 때 입력받은 필드 지정
    # 지금은 사용하지 않고 serializer 에서 처리 할 예정.
    REQUIRED_FIELDS = []
    
    objects = UserManager() # custom user 생성 시 필요
    
    def __str__(self):
        return self.username

    # 로그인 사용자의 특정 테이블의 crud 권한을 설정, perm table의 crud 권한이 들어간다.
    # admin일 경우 항상 True, 비활성 사용자(is_active=False)의 경우 항상 False
    def has_perm(self, perm, obj=None):
        return True
    
    # 로그인 사용자의 특정 app에 접근 가능 여부를 설정, app_label에는 app 이름이 들어간다.
    # admin일 경우 항상 True, 비활성 사용자(is_active=False)의 경우 항상 False
    def has_module_perms(self, app_label): 
        return True
    
    # admin 권한 설정
    @property
    def is_staff(self): 
        return self.is_admin

위의 코드를 user/models.py 에 입력하고
user/admin.py 로 들어가줍니다.

여기서는 각 앱마다 관리자 페이지에 표시될 모델을 관리합니다.

from django.contrib import admin
from django.contrib.auth.models import Group
from user.models import User
# Register your models here.

# Unregister Group
admin.site.unregister(Group)


admin.site.register(User)

기존에 사용하던 모델은 settings.py 에서 설정한 AUTH_USER_MODEL 로 대체되어 표시되지 않지만 Group은 사라지지 않고 보여지게 됩니다.
그래서 django.contrib.auth.models 의 Group 을 import 하여
unregister 시켜주면 더이상 관리자 페이지에서 보이지 않습니다.

이제 기본적인 커스텀 모델이 완성되었고 superuser를 생성하여 관리자 페이지로 한번 들어가보겠습니다.

# create superuser
python manage.py createsuperuser

확인용으로 관리자 계정을 3개 (admin, admin1, admin2) 만들었으며 아래는 django 관리자 페이지 입니다.

만들어둔 계정들이 잘 생성된 것을 볼 수 있습니다.

0개의 댓글