티스토리 뷰
get_user_model()을 많이 쓰는데, get_user_model에 대한 정리는 산발적으로 되어있다. 따라서 내가 여러 개념 들을 정리하고 축약해서 정리해보겠다. 당연히 User에 대해 간단히 우선적으로 알아보자. 상세산 설명은 여기를 눌러보자.
User
우리는 웹을 만들 때 회원관리를 위해 user를 DB에 넣어야 할 것이다. 이 때 기본적으로 User를 장고가 제공을 한다. 우선 장고 내부의 User가 어떻게 구현되어 있는지를 확인하자.
User가 가진 기능은 거의 없다. 대부분의 속성은 User가 가지고 있는게 아니라 User가 상속받는 AbstractUser가 다 가지고 있다. 즉, User는 기능이 없는 깡통 수준이고, 장고 내부에 세팅된 값이라 변경도 불가능하다. 그렇기 때문에 User 재정의가 필요한 것이다.
User 내부에 class Meta 내부에 있는 코드를 보자.
- swappable= 'AUTH_USER_MODEL' 의 뜻은 AUTH_USER_MODEL이라는 속성에 의해서 무엇인가가 바뀔 수 있다는 것을 의미한다. 이후에 User 설정하는 부분에서 AUTH_USER_MODEL를 사용할 수 있게 해주는 코드라고 생각하자.
그렇다면, User를 어떻게 재정의하나?
프로젝트 만들고, app 생성 후에 migrate 전 단계라고 가정을 하고 시작하겠다. (나는 account라는 app을 만들었다.)
account/models.py
from django.db import models
from django.contrib.auth.models import AbstractUser
# Create your models here.
class User(AbstractUser):
pass
이러한 방식으로 정의를 하면 된다. 그리고 settings.py에 아래와 같이 추가해 주면 된다.
AUTH_USER_MODEL = 'accounts.User'
AUTH_USER_MODEL은 accounts의 app의 models.py에서 내가 설정한 User를 사용하겠다고 설정하는 부분이다. 좀 더 개념적 이해를 위해 get_user_model()를 설명해 보겠다.
사용법
기본 USER
사용하는 방법은 get_user_model()을 활용해서 사용한다. 기본적으로 불러오는 방법은 아래와 같다.
from django.contrib.auth import get_user_model
get_user_model을 통해 User를 잡을 수 있는지를 확인해 보자. custom user를 정의하기 전에 get_user_model을 실행시켜보고, 그 이후에 내가 정의한 User를 get_user_model이 가리키는지를 확인해 보자.
프로젝트 생성 후에 아래와 같이 shell_plus를 통해 확인해 보고자 한다.
# 설치
> pip install django-extensions
# settings.py에 app추가
'django_extensions',
# shell_plus 실행
> python manage.py shell_plus
# shell_plus 실행
>>> get_user_model()
<class 'django.contrib.auth.models.User'>
get_user_model()은 django.contrib.auth.models.User를 가리킨다. 즉, 처음에 설명한 깡통 User를 가리킨다.
사용자 정의한 USER
그렇다면, 위에서 정의한 것들을 정의해 본 후에 get_user_model()이 가리키는 것을 확인해 보자.
account/models.py
from django.db import models
from django.contrib.auth.models import AbstractUser
# Create your models here.
class User(AbstractUser):
pass
이러한 방식으로 정의를 하면 된다. 그리고 settings.py에 아래와 같이 추가해 주면 된다.
AUTH_USER_MODEL = 'accounts.User'
그 후에 다시 shell_plus를 진행해준다.
>>> get_user_model()
<class 'accounts.models.User'>
내가 정의한 User로 잘 잡히는 것을 확인할 수 있다.
정리하면 get_user_model()은 기본적으로 내부 깡통 User를 잡는다. 그리고 custom으로 User를 따로 만들어도 get_user_model()은 새롭게 만든 User를 잡는다.
AUTH_USER_MODEL
AUTH_USER_MODEL 관련해서 추가 설명을 넣어보겠다. 기본적으로 디폴트 값은 아래와 같다.
AUTH_USER_MODEL = 'auth.User'
위에서 우리는 아래와 같이 settings.py에 추가 설정을 해줘서 디폴트 값을 바꾸는 것이다. 그리고 이것의 사용은 get_user_model()을 활용해서 한다.
AUTH_USER_MODEL = 'accounts.User'
- 'accounts.User' : accounts의 의미는 내가 만든 app의 이름을 의미하고, User는 models.py에서 정의한 class의 이름을 넣어준 거다.
get_user_model()과 settings.AUTH_USER_MODEL 차이점
기본적으로 같은 것을 가리키는 것 같다. 그렇다면 언제 무엇을 써야 하는가? 우선 shell_plus를 사용해서 확인을 해보자.
>>> get_user_model()
<class 'accounts.models.User'>
>>> settings.AUTH_USER_MODEL
'accounts.User'
- get_user_model() : 클래스이다.
- settings.AUTH_USER_MODEL : 문자열이다.
get_user_model()은 아래와 같이 문자열이 아닌 클래스가 들어가야 하는 경우에는 사용해 주면 된다.
from django.contrib.auth import get_user_model
from django.contrib.auth.forms import UserChangeForm, UserCreationForm
# 그대로 활용하지 못하는 경우는 항상 상속받아서 custom한다.
class CustomUserChangeForm(UserChangeForm):
class Meta:
model = get_user_model()
fields = ['username', 'first_name', 'last_name', 'email']
아래와 같이 클래스 내부에 들어가는 경우는 문자열을 쓰는 것이 맞다.
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
followers = models.ManyToManyField(
settings.AUTH_USER_MODEL,
related_name='followings'
)
마지막으로 정리해보면, 장고 내부의 User로 할 수 있는 게 제약이 많다. 따라서 내가 User를 models.py에 만들어준다. 그리고 settings.py에서 AUTH_USER_MODEL 설정을 해준다. 그 후에 get_user_model()을 이용해서 클래스로 사용해준다.
추가 내용은 아래에서 참고하자.
2020.08.13 - [Web/Django] - [Django]사용자인증관리_login, 쿠키와 세션, 캐쉬
2021.01.04 - [Web/Django] - [Django]사용자인증관리_User모델, 비밀번호 암호화
2021.01.05 - [Web/Django] - [Django] 장고 회원가입 구현하기 기초
2021.01.06 - [Web/Django] - [Django]장고 회원 프로필 구현하기
2021.01.07 - [Web/Django] - [Django]사용자인증관리_Update, 유저정보수정(UserChangeForm)
- Total
- Today
- Yesterday
- Express
- useHistory 안됨
- nodejs
- vuejs
- react autoFocus
- react
- logout
- 자료구조
- Python
- UserCreationForm
- 클라우데라
- nextjs autoFocus
- BFS
- Queue
- mongoDB
- read_csv
- JavaScript
- 자연어처리
- login
- useState
- DFS
- Vue
- django
- typescript
- NextJS
- error:0308010C:digital envelope routines::unsupported
- TensorFlow
- pandas
- Deque
- next.config.js
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |