장고 - 커스텀 유저 모델 만들기

1. 커스텀 유저 모델이란?

  • 기존에 있던 User 모델을 확장해서 내가 원하는 추가 필드를 만드는 것
  • User 모델 추가 하기 위해 코어를 수정하게 되면, 호환성 문제 발생 가능(취후의 수단으로 사용할 것)

2. 커스텀 유저 모델 만드는 3가지 방법

  1. 기존 유저 모델 확장하여 추가 정보만 입력
  2. AbstractBaseUser 사용하여 기본 기능 제외한 모든 기능과 필드를 새로 생성
  3. AbstractUser 사용하여 추가 필드를 포함한 유저 모델 생성

유저 모델 별 숙지사항

- 3가지 방법 중, 가장 편리한 방법은 AbstractUser를 사용하는 방법이다.
    - 주의해야 할 사항 : 기존 유저 정보를 사용 할 수 없으므로 프로젝트 생성 직후, 커스텀 유저 모델과 관리자 계정 생성 필요 
- 기존 User 모델은 AbstractUser라는 모델을 상속받아 필수 필드들이 이미 구현되어 있는 상태
  1. AbstractUser 모델 상속
    • AbstractUser 모델은 AbstractBaseUser라는 모델을 상속받아 구현된다.
    • Abstract : 모델 설정값에 Abstract 설정되어 있으면, 실제 모델로 사용 불가
    • 제일 권장하는 방식 - 프로젝트 시작 시점에 고려(기존 데이터 유지 불가))
  2. AbstractBaseUser 모델 상속
    • 모든 필드 구조를 변경하고 싶을 때
    • 퍼미션 기능 등 장고에서 사용하는 유저 기본 기능 전체를 수정하고 싶을 때
  3. 기존 User 모델 상속받거나, 확장해서 사용
    • User + AdditionalInfo(생일, 주소, 주민번호)
    • 회원 수정 페이지 AdditionalInfoForm 추가 출력
    • 사이트 운영 도중 확장 고려할 때 선택 가능 - 기존 User 데이터 그대로 존재 + 추가 테이블

3. AbstractUser을 이용한 커스텀 모델 생성 방법

  1. 장고 프로젝트에 accounts 앱 생성
    $ python manage.py startapp accounts

  2. INSTALLED_APPS 에 accounts 앱 추가

    • 경로 : config > settings.py
      1
      2
      3
      4
      INSTALLED_APPS = [
      ...
      accounts,
      ]
  3. AbstractUser 상속받아 새로운 User 모델 작성

    • 경로 : accounts > models.py
      1
      2
      3
      4
      5
      from django.contrib.auth.models import AbstractUser

      class User(AbstractUser): # 클래스 이름 다른 것으로 작성해도 무방하다.
      message = models.TextField(blank=True)
      profile = models.ImageField(upload_to='user_images/profile/%Y/%m/%d', blank=True)
  4. 커스텀 모델 settings.py에 설정

    • 경로 : config > settings.py
      AUTH_USER_MODEL = 'accounts.User'
  5. 새로 만든 유저 모델 DB 생성 위한 명령 실행 및 관리자 계정 생성 이후, 서버 실행

    1
    2
    3
    4
    5
    $ pip install pillow  # 이미지 필드 있으므로, Pillow 모듈 설치
    $ python manage.py makemigrations accounts
    $ python manage.py migrate
    $ python manage.py createsuperuser
    $ python manage.py runserver
  6. 유저 모델 확장하여 새로 만들었으므로, admin.py 등록

    • 유저 모델 추가
      1
      2
      3
      4
      from django.contib import admin
      from .models import User

      admin.site.register(User)
  7. admin.py에 UserAdmin 클래스 등록(UserAdmin 클래스 : 유저모델의 옵션 클래스)

    • 관리자페이지에 조회되는 유저 모델을 기존 사용자 모델과 흡사하게 변경하기 위함
      1
      2
      3
      4
      5
      from django.contib import admin
      from .models import User
      from django.contrib.auth.admin import UserAdmin

      admin.site.register(User, UserAdmin)
  8. 생성한 추가 필드를 관리자페이지에 나타나게 하기 위해 옵션 클래스 새로 만들어 등록

    • 경로 : accounts > admin.py
      1
      2
      3
      4
      5
      6
      7
      class CustomUserAdmin(UserAdmin):
      # fieldsets : 관리자 리스트 화면에서 출력될 폼 설정 부분
      UserAdmin.fieldsets[1][1]['fields']+=('profile','message')
      # add_fieldsets : User 객체 추가 화면에 출력될 입력 폼 설정 부분
      UserAdmin.add_fieldsets += (
      (('Additional Info'),{'fields':('profile','message')}),
      )
  9. CustomUserAdmin을 옵션클래스로 UserAdmin 대신 추가

    • 경로 : accounts > admin.py
      admin.site.register(User, CustomUserAdmin)

Additional

  • 기본 유저폼은 django.contrib.auth.forms에 만들어져 있고, UserAdmin에서 사용하는 사용자관리 관련 폼은 UserChangeForm, UserCreationForm 이다.
  • 만약 별도의 폼을 만들어 설정하고 싶다면, 커스텀 폼 클래스 생성하여 form, add_form에 할당해주면 된다.
    1
    2
    3
    class CustomUserAdmin(UserAdmin):
    form = CustomUserChangeForm
    add_form = CustomUserAddForm