CustomUser 클래스

2023. 3. 28. 17:35django

CustomUser 클래스는 Django에서 기본으로 제공하는 User 모델을 확장하여 사용자 정의 필드를 추가하거나 기존 필드를 수정하기 위한 클래스입니다.

Django의 User 모델은 기본적으로 사용자 인증과 관련된 필드를 가지고 있습니다. 예를 들어 username, password, email 등이 있습니다. 그러나 이러한 필드만으로는 모든 애플리케이션에서 요구되는 사용자 정보를 충분히 제공하기 어렵습니다.

따라서, CustomUser 클래스를 사용하여 User 모델에 필드를 추가하거나 수정하여 해당 애플리케이션의 요구사항에 맞게 만들 수 있습니다. 이 클래스는 AbstractUser 클래스를 상속받아 만들어지며, AbstractUser 클래스는 User 모델을 정의하는 데 사용되는 추상 클래스입니다.

예를 들어, 아래와 같이 CustomUser 클래스를 정의하여 User 모델에 phone_number 필드를 추가할 수 있습니다.

 

from django.contrib.auth.models import AbstractUser
from django.db import models

class CustomUser(AbstractUser):
    phone_number = models.CharField(max_length=20)

    upendress1 = models.CharField(max_length=100)

    address1 = models.CharField(max_length=100)

    address2 = models.CharField(max_length=100)

 

위와 같이 CustomUser 클래스를 정의하면, User 모델에 phone_number 필드가 추가되어 사용자 정보를 더욱 상세하게 저장할 수 있게 됩니다.

 

Django에서 User 모델은 내부적으로 기본 키(primary key)로 사용되는 id 필드를 가지고 있습니다. 따라서 User 모델을 확장하거나 사용자 정의 모델을 생성할 때, id 필드는 이미 User 모델에 정의되어 있으므로 추가할 필요가 없습니다.

대신, 사용자 정의 모델에서 User 모델과 관계를 설정하기 위해서는 OneToOneField를 사용하여 User 모델과 관련된 필드를 만들어야 합니다. 이를 통해 사용자 정의 모델과 User 모델 간에 일대일(One-to-One) 관계를 형성할 수 있습니다.

예를 들어, CustomUser 모델에서 User 모델과 관련된 필드를 만드는 방법은 다음과 같습니다.

 

from django.db import models
from django.contrib.auth.models import AbstractUser

class CustomUser(AbstractUser):
    # 사용자 정의 필드
    phone_number = models.CharField(max_length=20)

    upen_code = models.CharField(max_length=10)

    addr_1  = models.CharField(max_length=100)
    addr_2  = models.CharField(max_length=100)

    # User 모델과의 관계 설정
    user = models.OneToOneField(
        'auth.User',  # 다른 모델을 가리키는 ForeignKey를 위해 '앱이름.모델이름'으로 설정
        on_delete=models.CASCADE,
        primary_key=True,
    )

 

위 코드에서는 user 필드가 User 모델과의 관계를 설정하는 필드입니다. OneToOneField를 사용하여 auth.User 모델과의 관계를 설정하였으며, primary_key=True 옵션을 사용하여 user 필드를 CustomUser 모델의 기본 키(primary key)로 설정하였습니다. 이렇게 설정하면 CustomUser 모델은 User 모델과 일대일(One-to-One) 관계를 형성하게 됩니다.

 

CustomUser 클래스에서 phone_number, upen_code, addr_1, addr_2 필드를 추가하였습니다. 이렇게 CustomUser 클래스에서 사용자 정의 필드를 추가하면, User 모델에 정의된 필드 외에도 이 클래스에서 정의한 필드를 사용할 수 있게 됩니다.

  • phone_number: 사용자의 전화번호를 저장하는 필드입니다. max_length 매개변수를 통해 필드의 최대 길이를 설정할 수 있습니다.
  • upen_code: 사용자의 우편번호를 저장하는 필드입니다. max_length 매개변수를 통해 필드의 최대 길이를 설정할 수 있습니다.
  • addr_1: 사용자의 주소를 저장하는 필드입니다. max_length 매개변수를 통해 필드의 최대 길이를 설정할 수 있습니다.
  • addr_2: 사용자의 상세 주소를 저장하는 필드입니다. max_length 매개변수를 통해 필드의 최대 길이를 설정할 수 있습니다.

이렇게 사용자 정의 필드를 추가하면, 이 필드들은 CustomUser 모델의 인스턴스에서 사용할 수 있게 됩니다.

 

settings.py 에는 어떻게 설정하나요

CustomUser 모델을 사용하려면, Django의 인증 시스템에서 AUTH_USER_MODEL 설정을 변경해야 합니다.

  1. AUTH_USER_MODEL을 CustomUser로 변경합니다.

settings.py 파일에서 AUTH_USER_MODEL 설정을 변경합니다. 다음과 같이 AUTH_USER_MODEL 변수를 CustomUser 클래스의 위치를 나타내는 문자열로 설정합니다.

 

AUTH_USER_MODEL = 'myapp.CustomUser'

 

여기서 myappCustomUser 모델이 정의된 Django 앱 이름입니다. 만약 CustomUser 모델이 accounts 앱에서 정의되어 있다면, AUTH_USER_MODEL을 다음과 같이 설정합니다.

AUTH_USER_MODEL = 'accounts.CustomUser'

 

  1. 마이그레이션 파일 생성하기

AUTH_USER_MODEL 설정을 변경하면, 마이그레이션 파일을 생성하여 데이터베이스 스키마를 변경해야 합니다. 다음 명령어를 실행하여 마이그레이션 파일을 생성합니다.

python manage.py makemigrations
  1. 마이그레이션 적용하기

다음 명령어를 실행하여 데이터베이스 스키마를 변경합니다.

python manage.py migrate

AUTH_USER_MODEL 설정을 변경하고 나면, Django 앱에서 User 모델을 사용하는 코드를 모두 수정해야 합니다. 예를 들어, django.contrib.auth.forms.UserCreationForm 대신 myapp.forms.CustomUserCreationForm과 같은 사용자 정의 폼을 사용해야 합니다.