[Django] Custom User Model

Jin·2021년 10월 20일
0

django

목록 보기
14/14
post-thumbnail
post-custom-banner

1. User 모델 대체하기

  • 일부 프로젝트에서는 Django 내장 User 모델이 제공하는 인증 요구사항이 적절하지 않을 수 있다.
    • username 대신 email을 식별토큰으로 사용하는것이 더 적합한곳
  • Django는 User를 참조하는데 사용하는 Auth_USER_MODEL 값을 제공하여, default user model을 재정의(override) 할 수 있도록 함.
  • Django는 새 프로젝트를 시작할 경우 기본 사용자 모델이 충분해도, 커스텀 모델 유저 모델을 설정한느것을 강력히 권장
    • 단, 프로젝트의 모든 migrations 혹은 첫 migrate를 실행하기 전에 이 작업을 마쳐야 함!!

1) AUTH_USER_MODEL

  • User를 나타내는데 사용하는 모델
  • 프로젝트가 진행되는 동안 변경 불가
  • 프로젝트 시작시 설정하기 위한 것, 참조하는 모델은 첫번재 마이그레이션에서 사용 할 수 있어야함
  • 기본값 : 'auth.User' (auth앱의 User모델)

2) Custom User 모델 정의

1) 관리자 권한과 함게 완전한 기능을 갖춘 User 모델을 구현하는 기본 클래스인 AbstractUser를 상속받아 새로운 User 모델 작성

# accounts/models.py

from django.contrib.auth.models import AbstractUser

Class User(AbstractUser):
    pass

2) 기존에 django가 사용하는 User 모델이었던 auth앱의 User모델을 accounts 앱의 User 모델을 사용하도록 변경

# settings.py

AUTH_USER_MODEL = 'accounts.User'

3) admin site에 Custom User 모델 등록

# accounts/admin.py

from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from .models import User

admin.site.register(User, UserAdmin)

https://docs.djangoproject.com/en/3.2/topics/auth/customizing/#auth-custom-user

4) 모델 정의하기

  • 만약 프로젝트 중간에 진행을 했다면 데이터베이스를 초기화 한 후 마이그레이션 진행
  • 초기화 방법
    • db.sqlite3 파일 삭제
    • migrations 파일 모두 삭제 (파일명에 숫자가 붙은 파일만 삭제)

2. Built-in auth forms

  • UserCreationFrom과 UserChangeForm은 기존 내장 User 모델을 사용한 ModelForm이기 때문에 커스텀 User 모델로 대체해야함.
  • get_user_model() : 현재 프로젝트에서 활성화 된 user model을 return하는 함수
    • User 모델을 커스터마이징한 상황에서는 Custom User모델을 반환
    • 이 때문에 django는 User 클래스를 직접 참조하는 대신 django.contirb.auth.get_user_model() 을 사용해서 참조 해야한다고 강조!
# accounts/forms.py
from django.contrib.auth.forms import UserChangeForm, UseCreationForm
from django.contrib.auth import get_user_model

class CustomUserChangForm(UserChangeForm):
    class Meta:
    	model = get_user_model()
        fields = '__all__'

class CustomUserCreationForm(UserCreationForm):
    class Meta(UserCreationForm.Meta): 
    # 기존의 UserCreationForm을 상속 받음
    	model = get_user_model()
        fields = UserCreationForm.Meta.fields + ('email',)
        


> https://github.com/django/django/blob/main/django/contrib/auth/forms.py

profile
내가 다시 볼려고 작성하는 블로그
post-custom-banner

0개의 댓글