03.-2 Users 앱

조재훈·2022년 7월 15일
0

Clone_Airbnb

목록 보기
7/31
post-thumbnail

성공적으로 Users 앱을 만들고 등록했지만 관리자 페이지에 가보면 이전에 있던 Users 모델이 사라졌다.

이는 기존의 admin 패널에 있던 users를 대체해버렸기 때문에 안보이는 것이다.

1) admin.py 수정

일단 코드를 아래와 같이 작성하자
users - admin.py

from django.contrib import admin
from . import models

@admin.register(models.User)
class CustomUserAdmin(admin.ModelAdmin):
pass

그리고 관리자 페이지를 들어가보면 Users가 생겼다.

속성들도 의도한 대로 생성되었다. 물론 User 클래스가 비어있으므로 여기에 나온 것들은 상속받은 AbstractUser와 동일하다.

2. models.py 수정

User 클래스에 아래의 내용을 추가한다
users - models.py

bio = models.TextField()

근데 이 상태에서 바로 admin 페이지로 들어가면 에러가 난다. 왜냐면 방금 추가한 bio에 대한 정보가 DB에 없기 때문이다.

migration을 해주자.

python manage.py makemigrations

이미 기존의 필드 정보만 가지고 DB에 저장된 내용들이 있는데 추가로 필드를 생성할 경우 기존의 내용들에는 어떻게 적용을 할 것인지 묻는 내용이다. default를 입력해서 해당 사항이 없을경우 자동으로 입력되는 값을 넣어주어야 한다.

bio = models.TextField(default="")

다시 migrate

admin 페이지에 다시 들어가보면 Bio 필드가 생성된 것을 볼 수 있다.

3) default와 null

default는 미처 반영되지 못한 내용들에 채워넣는 기본값을 의미 ("" 와 같이 쌍따옴표 가능)
null은 해당 칸이 비어있는 칸에 NULL을 저장한다.

https://docs.djangoproject.com/en/4.0/ref/models/fields/#django.db.models.Field.null
Model field reference

string-based 필드인 TextField와 CharField에는 null=True를 가급적 사용하지 말라고 한다. 이유인 즉슨 이것이 두 가지 의미로 해석될 수 있기 때문이라고 한다.
1) 데이터가 존재하지 않음 ("no data")
2) 문자열이 비어있음 ("")

4) User 클래스 추가 수정

migration을 해주자

python manage.py makemigrations

공포의 주홍글씨가 다시 등장했다.
내용은 ImageField의 경우 Pillow라는 라이브러리가 설치되어있어야 사용할 수 있다고 한다.

Pillow를 설치해주자 (* pip이 아닌 pipenv로 설치하자)

pipenv install pillow

다시 migration

python manage.py makemigrations

'avatar' 필드가 비어있으면 어떻게 해결할 것인지 묻는 내용이 뜬다. migrate를 취소하고 avatar 필드에 null=True를 입력해주자.

avatar = models.ImageField(null=True)

다시 migrate

admin 페이지에 들어가보면 avatar, gender 필드가 잘 추가된 것을 볼 수 있다.

여기서 TextField와 CharField의 차이를 볼 수 있는데 전자는 여러 줄을 입력할 수 있다면 후자는 한 줄밖에 입력을 못한다.

5) CharField 수정 - choices

Gender 필드가 CharField인데 일반적으로 여겨지는 성(gender)는 남/여/기타 인데 저기에는 전혀 상관없는 내용을 입력할 수 있다는 문제가 있다.

따라서 선택지를 주고 그 중에서 선택하도록 해야 한다. 특히 에어비앤비와 같은 숙박 서비스에서는 고객의 성별이 꽤나 중요하다.

users - models.py - User

GENDER_MALE = "male"
GENDER_FEMALE = "female"
GENDER_OTHER = "other"

GENDER_CHOICES = (
(GENDER_MALE, "Male"),
(GENDER_FEMALE, "Female"),
(GENDER_OTHER, "Other"),
)

gender = models.CharField(choices=GENDER_CHOICES, max_length=10, null=True)

admin 페이지를 켜보면 아래와 같이 gender 선택하는 바가 생긴다.

이것은 단순히 선택지를 부여한 것이고 데이터 구조에 영향을 준 것은 아니기 때문에 migrate를 할 필요는 없다.

6) default 입력

자 그러면 저장을 해보자

에러가 발생하는데 빈 칸을 무조건 입력하라고 한다.
null을 입력했는데 왜 그럴까?

null은 데이터베이스에서 사용되는 것이고
blank라고 이러한 입력 form에서 사용되는 것이 또 있다.

avatar = models.ImageField(mull=True, blank=True)
gender= models.CharField(choices=GENDER_CHOICES, max_length=10, null=True, blank=True)
bio = models.TextField(default="", blank=True)

admin 창을 새로고침해보면 이전과는 달리 필드의 글자가 bold 처리가 해제된 것을 볼 수 있다.

profile
맨땅에 헤딩. 인생은 실전.

0개의 댓글