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()
'IT > Python' 카테고리의 다른 글
Djnago, 테스트 폴더 안 테스트 파일을 인식하지 못할 때 (1) | 2024.10.31 |
---|---|
APIClient와 APIRequestFactory의 차이 (1) | 2024.10.09 |
Django, foreignkey error - 무결성에 문제가 없더라도 migrations 폴더와 pycache에 문제가 없는지 살펴보기 (0) | 2024.04.12 |
Django, 서드파티 앱에 대해서 (0) | 2024.04.08 |
Django Rest Framework(DRF)를 이용한 API 뷰 구현 (0) | 2024.04.08 |