티스토리 뷰
인스타그램 클론 코딩을 하다보니 Django가 기본적으로 제공하는 User 모델에서 더 필요한 필드가 있었다.
구글링을 해보니 대부분의 글이 User 모델 자체를 재정의하고 있었다. (PK를 username이 아닌 email로 하기 위한)
그러나 나는 필드만 몇 가지 추가하면 되었기 때문에 다음과 같은 방법을 찾았다.
1. 프로젝트를 새로 시작하는 경우 - migration 하기 전
이 경우는 User 모델을 확장하기 가장 쉽고 깔끔한 경우이다.
다음 단계에 따라 User 모델을 확장한 후 migration을 하자.
1.1 models.py
우선 User 모델을 확장하거나 커스터마이징하기 위한 함수는 여러가지가 있다. 우리는 필드만 추가할 것이므로
AbstractUser 함수를 불러와야 한다. 이를 사용하면 기존의 auth_user 테이블에 있던 컬럼들을 전부 유지한 채 새로운
컬럼을 추가할 수 있다.
- AbstratUser: User에서 동작은 그대로 하고 필드만 재정의할 때 사용
from django.db import models
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
profile_img_src = models.CharField(max_length=150, blank=True)
profile_msg = models.TextField(max_length=500, blank=True)
birth_date = models.DateField(null=True, blank=True)
1.2 settings.py
새로 정의한 User를 기존의 auth_user 모델을 대신하여 사용하기 위해 setting.py
에 다음 필드를 추가한다.
# settings.py
...
AUTH_USER_MODEL = 'AppName.User'
...
1.3 migration
python manage.py makemigrations
python manage.py migrate
migrations을 한 후 데이터베이스를 확인해보면 우리가 추가한 필드가 들어가있는 것을 확인할 수 있다.
2. 프로젝트를 어느 정도 진행한 경우 - migration을 한 번이라도 한 경우
(새로운 데이터베이스로 갈아탈 수 있어야 함)
migration을 한 번이라도 했다면 위 단계를 그대로 따라하고 migration 명령을 실행했을 때 다음과 같은 에러가 발생한다.
이 에러는 admin
의 migration 파일이 accounts
앱의 0001_initial
migration 파일에 의존적이다는 메시지이다.
즉, admin
사이트에도 모델이 있는데 이것이 AUTH_USER_MODEL
에 의존적이어서 문제가 생기는 것이다. 새로운 앱을
migrate 할 때는 빈 데이터베이스에 admin
앱과 새로운 앱이 같이 migration 되어서 문제가 없었는데, 이미 admin
앱
이 migration 된 상태에서 새로운 User 모델을 migrate 하려니 에러가 발생한다.
따라서, migration 명령을 실행하기 전 다음 단계를 거쳐야 한다.
2.1 새로운 데이터베이스 생성
기존의 데이터베이스는 이미 auth_user 테이블이 생긴 상황이기 때문에 user 모델을 수정하려고 하면 위와 같은 에러가
발생한다. 따라서, 새로운 데이터베이스를 만들고 그 위에 새로 migrtaion을 하는 것이 훨씬 간단하게 처리할 수 있다.
2.2 settings.py 수정
# settings.py
...
#DB 변경
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'New DB NAME',
'USER': 'root',
'PASSWORD': 'Password',
'HOST': '127.0.0.1',
'PORT': 3306,
}
}
...
AUTH_USER_MODEL = 'AppName.User'
...
2.3 migration 파일 삭제
migration 파일들은 DB를 바꿔도 프로젝트에 남아 있다. 이 상태에서 migration 명령을 실행하면 에러가 발생할 가능성이
상당히 높다. 따라서, 이미 migration 명령을 실행한 적이 있다면 이와 관련된 파일을 전부 삭제해야 한다.
migrations 폴더에서 __pycache__
폴더와 __init__.py
파일을 제외한 모든 파일을 삭제한다.
(만일의 경우에 대비해 삭제하기 전에 파일들을 백업하기)
이 단계를 모두 마친 후 다시 migration 명령을 실행하면 에러없이 새로운 DB에 새로운 User 모델이 올라간 것을 볼 수 있다.
3. view에서 확장된 User 모델 사용하기
Django에서 기본으로 제공하는 User 모델은 auth 프레임워크가 제공하는 것이다.
그래서 우리가 User 모델을 사용할 때 다음과 같이 import를 한다.
...
from django.contrib.auth.models import User
...
그러나 User 모델을 확장하거나 커스터마이징을 한 후 migrate를 시키면 데이터베이스에 다음과 같이 테이블이 생성된다.
즉, auth가 아닌 확장을 진행한 models.py가 있는 app의 이름으로 User 테이블이 생성된다.
따라서, 다음과 같이 User 모델을 import 시켜야 사용할 수 있다.
...
from app_name.models import User
...
참고 자료
장고(Django) 유저 모델(User Model), AbstractUser를 이용해 변경하기
간단 용어 정리.
medium.com
django login 유저 확장 방법 - 김땡땡's blog
장고의 auth 기능은 User 객체를 제공한다. 우리는 기본 default로 이 User 객체로 여러 인증을 구현할 수 있다. User model User model의 기본적으로 있는 여러 필드들이 있다. username 필수사항이다. 150자 이하, 영숫자를 포함하도록 기본적인 vaildate가 있다. first_name 선택사항이다. 30자 이하 last_name 선택사항. 150자 이하 email 선택사항 password 필수 사항. 설정한 암호의
yonghyunlee.gitlab.io
장고(Django) 사용자인증 제 1 편
장고(Django) 웹프레임워크에서 기본 제공하는 auth 프레임워크를 이용하여 사용자가입을 구현하는 방법을 설명합니다. 또한 모델폼을 이용하여 쉽게 템플릿을 구현하는 방법을 알아봅니다.
swarf00.github.io
'Django' 카테고리의 다른 글
[Django Basic 13] default_storage (0) | 2020.02.26 |
---|---|
[Django Basic 12] Static File & Media File (0) | 2020.02.26 |
[Django basic 10] Django Autentication (0) | 2020.02.15 |
[Django Basic 09] {% csrf_token %} (0) | 2020.02.09 |
[Django Basic 08] URL Reverse (0) | 2020.02.09 |
- Total
- Today
- Yesterday
- Django 북마크
- Django application
- python
- Django 검색
- Django User
- query parameter
- Django 회원 정보 수정
- Django 해시태그
- Django 댓글
- Django 컬렉션
- Django Instagram
- Django 비밀번호 수정
- 장고
- java
- Django 프로젝트 생성
- 서점 어플리케이션
- MySQL
- Redis Cache
- Redis
- 파이썬
- Django 로그인
- Django 회원가입
- Django
- Django 로그아웃
- Django 업로드
- Django 어플리케이션
- Django 좋아요
- Django 인스타그램
- 북마크 어플리케이션
- Django 팔로우
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |