본문 바로가기
IT/Python

Django 사용자 모델 커스터마이징하기

by Cyber_ 2024. 10. 9.

Django의 기본 사용자 모델은 많은 프로젝트에 충분하지만, 때로는 추가 정보를 저장하거나 기본 동작을 변경해야 할 필요가 있습니다. 이러한 요구사항을 충족하기 위해 Django는 사용자 모델을 커스터마이징할 수 있는 기능을 제공합니다. 다음은 커스텀 사용자 모델을 구현하는 방법을 단계별로 설명합니다.

1. settings.py에서 사용자 모델 설정하기

프로젝트의 settings.py 파일에서 AUTH_USER_MODEL 설정을 추가하여 Django에게 기본 사용자 모델 대신 사용할 모델을 알립니다.

  • config/settings.py
AUTH_USER_MODEL = 'user.User'

이 설정은 user앱의 User모델을 참조합니다. 이렇게 설정함으로써, Django는 모든 인증 관련 구조에서 이 커스텀 모델을 기본 모델로 사용하게 됩니다.

2. 사용자 모델 정의하기

커스텀 사용자 모델을 정의하기 위해 AbstractBaseUser를 상속받아 필요한 필드와 메서드를 추가합니다. 이 예제에서는 이메일을 주 사용자 이름 필드로 사용하며, 연락처 정보와 주소 등의 추가 필드를 포함합니다.

  • user/models..py
from django.db import models
from django.contrib.auth.models import AbstractBaseUser
from django.contrib.auth.base_user import BaseUserManager
from common.models import TimestampBaseModel
from cart.models.cart import Cart
from django.utils import timezone
from datetime import timedelta
import uuid


class CustomUserManager(BaseUserManager):
    def create_user(self, username, email, password=None, **extra_fields):
        if not email:
            raise ValueError('The Email field must be set')
        email = self.normalize_email(email)
        user = self.model(username=username, email=email, **extra_fields)
        user.set_password(password)
        user.save(using=self.db)
        return user

    def create_superuser(self, username, email, password=None, **extra_fields):
        extra_fields.setdefault('is_staff', True)
        extra_fields.setdefault('is_admin', True)

        return self.create_user(username, email, password, **extra_fields)


class User(TimestampBaseModel, AbstractBaseUser):
    username = models.CharField(max_length=20, null=True, blank=True, help_text='유저 이름')
    email = models.EmailField(max_length = 50, unique=True, help_text='유저 이메일')
    phone = models.CharField(max_length = 20, help_text = '연락가능한 번호')
    address = models.CharField(max_length = 100, default = "도로명주소")
    detailAddress = models.CharField(max_length = 100, default = "상세주소", help_text='상세주소')
    postCode = models.CharField(max_length = 100, default = "우편번호")
    points = models.IntegerField(default = 0)

    is_active = models.BooleanField(default=True)
    is_admin = models.BooleanField(default=False)
    is_staff = models.BooleanField(default=False)

    objects = CustomUserManager()

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['username', 'phone', 'address', 'detailAddress', 'postCode']

    def __str__(self):
        return self.username

    def has_perm(self, perm=None, obj=None):
        return self.is_admin

    def has_module_perms(self, app_label=None):
        return self.is_admin

3. 사용자 모델 사용하기

모델을 정의한 후에는, 어디에서나 get_user_model()함수를 사용하여 사용자 모델을 가져올 수 있습니다. 이 함수는 현재 활성화된 사용자 모델을 동적으로 반환합니다.

from django.contrib.auth import get_user_model

User = get_user_model()