장고 - 커스텀 유저 모델 만들기
1. 커스텀 유저 모델이란?
- 기존에 있던 User 모델을 확장해서 내가 원하는 추가 필드를 만드는 것
- User 모델 추가 하기 위해 코어를 수정하게 되면, 호환성 문제 발생 가능(취후의 수단으로 사용할 것)
2. 커스텀 유저 모델 만드는 3가지 방법
- 기존 유저 모델 확장하여 추가 정보만 입력
- AbstractBaseUser 사용하여 기본 기능 제외한 모든 기능과 필드를 새로 생성
- AbstractUser 사용하여 추가 필드를 포함한 유저 모델 생성
유저 모델 별 숙지사항
- 3가지 방법 중, 가장 편리한 방법은 AbstractUser를 사용하는 방법이다. - 주의해야 할 사항 : 기존 유저 정보를 사용 할 수 없으므로 프로젝트 생성 직후, 커스텀 유저 모델과 관리자 계정 생성 필요 - 기존 User 모델은 AbstractUser라는 모델을 상속받아 필수 필드들이 이미 구현되어 있는 상태
- AbstractUser 모델 상속
- AbstractUser 모델은 AbstractBaseUser라는 모델을 상속받아 구현된다.
- Abstract : 모델 설정값에 Abstract 설정되어 있으면, 실제 모델로 사용 불가
- 제일 권장하는 방식 - 프로젝트 시작 시점에 고려(기존 데이터 유지 불가))
- AbstractBaseUser 모델 상속
- 모든 필드 구조를 변경하고 싶을 때
- 퍼미션 기능 등 장고에서 사용하는 유저 기본 기능 전체를 수정하고 싶을 때
- 기존 User 모델 상속받거나, 확장해서 사용
- User + AdditionalInfo(생일, 주소, 주민번호)
- 회원 수정 페이지 AdditionalInfoForm 추가 출력
- 사이트 운영 도중 확장 고려할 때 선택 가능 - 기존 User 데이터 그대로 존재 + 추가 테이블
3. AbstractUser을 이용한 커스텀 모델 생성 방법
장고 프로젝트에 accounts 앱 생성
$ python manage.py startapp accounts
INSTALLED_APPS 에 accounts 앱 추가
- 경로 : config > settings.py
1
2
3
4INSTALLED_APPS = [
...
accounts,
]
- 경로 : config > settings.py
AbstractUser 상속받아 새로운 User 모델 작성
- 경로 : accounts > models.py
1
2
3
4
5from 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)
- 경로 : accounts > models.py
커스텀 모델 settings.py에 설정
- 경로 : config > settings.py
AUTH_USER_MODEL = 'accounts.User'
- 경로 : config > settings.py
새로 만든 유저 모델 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유저 모델 확장하여 새로 만들었으므로, admin.py 등록
- 유저 모델 추가
1
2
3
4from django.contib import admin
from .models import User
admin.site.register(User)
- 유저 모델 추가
admin.py에 UserAdmin 클래스 등록(UserAdmin 클래스 : 유저모델의 옵션 클래스)
- 관리자페이지에 조회되는 유저 모델을 기존 사용자 모델과 흡사하게 변경하기 위함
1
2
3
4
5from django.contib import admin
from .models import User
from django.contrib.auth.admin import UserAdmin
admin.site.register(User, UserAdmin)
- 관리자페이지에 조회되는 유저 모델을 기존 사용자 모델과 흡사하게 변경하기 위함
생성한 추가 필드를 관리자페이지에 나타나게 하기 위해 옵션 클래스 새로 만들어 등록
- 경로 : accounts > admin.py
1
2
3
4
5
6
7class CustomUserAdmin(UserAdmin):
# fieldsets : 관리자 리스트 화면에서 출력될 폼 설정 부분
UserAdmin.fieldsets[1][1]['fields']+=('profile','message')
# add_fieldsets : User 객체 추가 화면에 출력될 입력 폼 설정 부분
UserAdmin.add_fieldsets += (
(('Additional Info'),{'fields':('profile','message')}),
)
- 경로 : accounts > admin.py
CustomUserAdmin을 옵션클래스로 UserAdmin 대신 추가
- 경로 : accounts > admin.py
admin.site.register(User, CustomUserAdmin)
- 경로 : accounts > admin.py
Additional
- 기본 유저폼은 django.contrib.auth.forms에 만들어져 있고, UserAdmin에서 사용하는 사용자관리 관련 폼은 UserChangeForm, UserCreationForm 이다.
- 만약 별도의 폼을 만들어 설정하고 싶다면, 커스텀 폼 클래스 생성하여 form, add_form에 할당해주면 된다.
1
2
3class CustomUserAdmin(UserAdmin):
form = CustomUserChangeForm
add_form = CustomUserAddForm
Posted
tags:
{ Django }