#5.0 Introduction
- user에 추가적인 기능을 넣고 싶다! 프로필 이미지..사용자 이름..이런 것들
#5.1 Custom Model
- python manage.py startapp users
- 두번째 콘솔에 다음과 같이 입력하면 user 파일 생성
- 장고의 user를 상속받기위해
- 이렇게 쓰지 않음 (이렇게 쓰면 user를 처음부터 다 만드는 거임)
- 대신에 모듈 사용할거라 models에 추가해주면 돼
- from django.contrib.auth.models import AbstractUser
- 그리고 장고한테 우리만의 user model을 사용하겠다고 알려야 함 config-settings맨 뒤에 밑에 코드 추가
#Auth
AUTH_USER_MODEL = "users.User"
- 서버에 application 설치하기 settings의 Custom_apps에 "users.apps.UsersConfig” 추가
- 우리 서버에 이미 사용자가 존재하는데 이 사용자는 기존의 장고가 만든 user를 쓰기 때문에 또 에러발생(그래서 원래 user model 만드는 걸 제일 초반에 함)
- 따라서 dbsplite3지우고, houses안의 migrations안에서 00으로 시작하는거 다 지우고, makemigrations,migrate하면 database가 다시 업데이트 된다!
- models에서 새로 정의한 user class를 관리자(admin) 페이지에 추가하기
- 상속 특성을 이용해서 전에 정의한 UserAdmin에 대해 상속(import UserAdmin)
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from .models import User
@admin.register(User)
class CustomerUserAdmin(UserAdmin):
pass
- 다음과 같이 users-admin.py에 작성
- 그리고, runserver하면??? 로그아웃 되어있다 왜!!?
- 우리가 데이터베이스를 지웠기 때문이지~~
- 서버 죽이고(clear), python manage.py createsuperuser 다시 실행하기
#5.2 Custom Fields
- User 모델을 커스텀할 수 있는 방법들이 무엇인지 배울 예정
- AbstractUser을 덮어쓰거나, 속성 몇 개를 없애거나, 로직을 추가하는 방법
- Users의 model.py에서 ctrl누르고 AbstractUser를 눌러
- django에서 만든 소스코드는 절대 수정하지 말기 그래서 덮어쓰고 내가만든 User안에서 수정할거임
from django.db import models
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
first_name = models.CharField(max_length=150,
editable=False)
last_name = models.CharField(max_length=150,
editable=False)
name = models.CharField(max_length=150)
is_host = models.BooleanField()
- models.py를 다음과 같이 바꾸고 makemigrations하면
- 전엔 못보던 이런 메세지가 뜸
- is_host가 not null(Boolean)이기 때문에 기본값을 설정해야 한다는 소리임(2번 선택)
#5.3 Defaults
- 왜 위의 에러가 발생했는지 알아볼 것임
- 해결방안 1) is_host에 default값 추가
- 2) null = True 옵션 추가
- 그래서 default=False추가하고 다시 makemigrations하면??
- 이번엔 에러가 아니라 경고가 뜸 like this
- 이번엔 기존에 있던 사용자에 대해선 name에 어떤 값이 들어가야 하냐고 묻는 겨
- name에 default = “”추가
- makemigrations, migrate하면?
- user 수정하려고 할 때 또 이런 오류가.. 발생함
#5.4 Custom Admin
- admin.py에서 fieldsets은 관리자 페이지에서 model의 field가 보이는 순서를 설정할 수 있음
- fieldsets와 field의 차이
- field는 그냥 “”이런 식으로 이름만 넣을 수 있음
- fieldsets은 좀 더 자세하게 옵션 추가 가능
- fieldsets은 tuple로 되어 있어야 함, 그 tuple 안에 또 다른 tuple을 만들어서 section을 나눌 수 있음
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from .models import User
@admin.register(User)
class CustomerUserAdmin(UserAdmin):
fieldsets = (
("Profile",
{
"fields": ("username","password","name",
"email","is_host"),
},
),
)
- 권한에 관한 fieldsets도 추가해줄 수 있다 이렇게!
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from .models import User
@admin.register(User)
class CustomerUserAdmin(UserAdmin):
fieldsets = (
("Profile",
{
"fields": ("username","password","name",
"email","is_host"),
},
),
("Permissions",{
"fields": (
"is_active",
"is_staff",
"is_superuser",
"groups",
"user_permissions",
),
},
)
)
- important dates도 추가해줄거임
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from .models import User
@admin.register(User)
class CustomerUserAdmin(UserAdmin):
fieldsets = (
("Profile",
{
"fields": ("username","password","name",
"email","is_host"),
},
),
("Permissions",{
"fields": (
"is_active",
"is_staff",
"is_superuser",
"groups",
"user_permissions",
),
},
),
("Important Dates", {"fields": ("last_login",
"date_joined"),
},
),
)
- 튜플 괄호 뒤에 콤마 붙이면 알아서 예쁘게 코드 보일 수 있게 해준대
- 부가적인 기능으로 classes이용해서 collapse, wide등을 통해 기본 숨기기, 가로 방향으로 공간 추가하기 할 수 있음
- 어떤 column을 보여주고 어떤 column을 숨길지 결정하는 list_display도 사용
list_display = ("username", "email","name","is_host")
#5.5 Foreign Keys
- houses와 users를 연결
- houses모델에 owner를 추가할건데, 여기서 owner은 사용자의 고유ID로 FK가 됨. 즉 user 모델에서 참조한다!
- 외래키 설정할 때 필수 옵션 on_delete=?
1)
on_delete = models.SET_NULL
- 참조하는 키가 지워져도 null값으로 남아있음(ex. 쇼핑몰에서 이용자가 탈퇴해도 결제 내역은 나중에 세금계산 때문에 남아있어야 함!)
2)
on_delete = models.CASCADE
- 참조하는 키가 지워지면 같이 지워짐(ex. 프로필 사진을 삭제하면 더 이상 그 이미지 파일을 저장하거나 볼 수 없음)
from django.db import models
#Model definition for House
class House(models.Model): # 모델이니까 모델 상속받음
name = models.CharField(max_length=140) # name에 대한 데이터 형식, 최대길이 설정
price_per_night = models.PositiveIntegerField(verbose_name="Price")
description = models.TextField()
address = models.CharField(max_length=140)
pets_allowed = models.BooleanField(default=True,help_text="Does this house allow pets?")
owner = models.ForeignKey("users.User",on_delete=models.CASCADE)
def __str__(self):
return self.name
- 이런식으로 owner부분추가
- migrations에 있는 00~ 파일 다 삭제하고 sqlite도 삭제!
- 그리고 다시 makemigration,migrate,createsuperuser
- house 추가를 누르면 owner부분이 새롭게 추가 된 것을 확인 가능(owner는 user중 하나여야 함)
#5.6 Super Mega Recap
- 데이터베이스에 이미 데이터가 있는 상태에서 column을 추가한다면, 에러가 발생할 수 있음 따라서, columnn에 default값을 추가해야 함(또는 null=True)
- user랑 house를 연결하고 싶음(데이터를 지목하는 형식(참조))
- 확장 프로그램 sqlite viewer 깔면 vscode에서 데이터베이스 엑셀처럼 볼 수 있음
'Backend > Django' 카테고리의 다른 글
[백엔드][장고][Django] Chapter #7 (0) | 2023.07.17 |
---|---|
[백엔드][장고][Django] Chapter #6 (0) | 2023.07.15 |
[백엔드][장고][Django] Chapter #4 (0) | 2023.07.13 |
[백엔드][장고][Django] Chapter #3 (0) | 2023.07.13 |
[백엔드][장고][Django] Chapter #2 (0) | 2023.07.13 |
Uploaded by Notion2Tistory v1.1.0