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 관리자 페이지 입니다.

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