django CustomUserModel
1. 커스텀 유저 모델
장고에서는 기본적으로 제공되는 User 모델이 있음
하지만 프로젝트마다 사용자 정보 요구 사항이 다르기 때문에 기본 모델을 수정하거나 확장 필요
->이 때 사용하는 것이 커스텀 유저 모델임
커스텀 유저 모델은 기본 AbstractUser 또는 AbstractBaseUser를 상속받아 새로운 사용자 모델을 정의하여 사용
2. 커스텀 유저 모델이 필요한 이유
기본 유저 모델이 제공하는 필드만으로는 부족한 경우가 많음
ex 전화번호를 추가하거나 이메일을 아이디로 사용하고 싶을 때
확장성을 위해 프로젝트 초기 단계에서 커스텀 유저 모델을 설정하는 것이 좋음
3. 커스텀 유저 모델 구현 방법
1) AbstractUser 상속
기본 제공되는 유저 모델을 확장하는 방법으로 AbstractUser를 상속받음
from django.contrib.auth.models import AbstractUser
from django.db import models
class CustomUser(AbstractUser):
phone_number = models.CharField(max_length=15, blank=True, null=True)
2) AbstractBaseUser 상속
완전히 새로운 유저 모델을 정의하고 싶을 때 AbstractBaseUser를 사용함
이 경우 BaseUserManager를 이용해 커스텀 매니저를 작성해야 함
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager
from django.db import models
class CustomUserManager(BaseUserManager):
def create_user(self, email, password=None, **extra_fields):
if not email:
raise ValueError("The Email field must be set")
email = self.normalize_email(email)
user = self.model(email=email, **extra_fields)
user.set_password(password)
user.save(using=self._db)
return user
def create_superuser(self, email, password=None, **extra_fields):
extra_fields.setdefault("is_staff", True)
extra_fields.setdefault("is_superuser", True)
return self.create_user(email, password, **extra_fields)
class CustomUser(AbstractBaseUser):
email = models.EmailField(unique=True)
name = models.CharField(max_length=255)
is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(default=False)
objects = CustomUserManager()
USERNAME_FIELD = "email"
REQUIRED_FIELDS = ["name"]
4. 설정 파일에 반영
커스텀 유저 모델을 만들었으면 settings.py에 이를 반영해야 함
AUTH_USER_MODEL 설정값을 커스텀 모델로 변경함
AUTH_USER_MODEL = "myapp.CustomUser"
5. 마이그레이션
커스텀 유저 모델을 만들고 AUTH_USER_MODEL을 설정했으면 마이그레이션을 진행해야 함
기존 데이터베이스가 있다면 커스텀 유저 모델로의 전환이 복잡하므로 초기부터 설정하는 것이 중요
6. 장고 관리자(admin)와의 통합
커스텀 유저 모델을 장고 관리자에서 관리하려면 UserAdmin을 커스터마이징해야 함
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from .models import CustomUser
@admin.register(CustomUser)
class CustomUserAdmin(UserAdmin):
model = CustomUser
fieldsets = UserAdmin.fieldsets + (
("Additional Info", {"fields": ("phone_number",)}),
)
7. 주의사항
커스텀 유저 모델을 설정한 이후에는 기존 User 모델과 혼용하지 말아야 함
모든 참조와 관계 설정에서 AUTH_USER_MODEL을 사용해야 함
from django.conf import settings
from django.db import models
class Profile(models.Model):
user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
bio = models.TextField(blank=True)