2. House Model
1. 모델 만들기
이제 Model을 만들어 db와 연동시킨다. 제일 먼저 만들 model은 집에 대한 정보인 House이다.
이를 위해 먼저 app을 등록시켜 준다. 터미널에서 가상환경으로 들어가 poetry run python manage.py startapp houses를 실행한다(이제부터는 poetry run은 생략한다). 그러면 왼쪽 탐색창에 houses앱이 추가된것을 확인할 수 있다.
새로운 앱을 만들어줬기 때문에 config의 settings에 새로운 앱을 만들었다고 알려줘야 한다. 이를위해 아래와 같이 작성한다. houses.apps.HousesConfig는 houses app안에 apps파일 안에 HousesConfig클래스를 등록시킨다는 의미이다.
config에 등록을 마쳤다면, houses app에서 사용할 db를 만들어 준다. 장고에서는 이를 위해 models.py에 작성한다.
from django.db import models
# Create your models here.
class House(models.Model):
"""
Model for houses
"""
name = models.CharField(max_length=140)
address = models.CharField(max_length=140)
description = models.TextField()
price = models.PositiveIntegerField()
모델을 만든것만으로도 사용할 수 있지만, 전에 봤던 admin페이지에서 이 모델을 관리하게 하기 위해서는 추가적인 설정이 필요하다. 이를 위해 houses/admin.py에 아래와 같이 작성한다.
from django.contrib import admin
from .models import House
@admin.register(House) # House모델을 관리하겠다고 명시하는 데코레이터
class HouseAdmin(admin.ModelAdmin): # 모델을 관리하기위한 클래스
pass
이후 만든 db를 django에게 알려준다. 이를 위해 터미널에 python manage.py makemigrations를 먼저 입력하고 python manage.py migrate를 실시한다. 그리고 나서 admin페이지를 들어가보면 다음과 같은 화면이 나타난다.
만든 모델이 admin페이지에 나타나는 것을 확인할 수 있다.
2. 모델 업데이트 및 admin페이지 수정
가. 모델 업데이트
모델 업데이트는 간단하다. 만든 모델에 수정하고 싶은 부분을 수정하고 makemigrations와 migrate를 실시해준다.
그리고 위의 사진에서 보면 db에 내용을 추가했지만 House object(1) 이라고 나타나는 것을 확인할 수 있는데, 이를 name으로 변경하고 싶으므로 __str__ 함수를 활용하여 보여지는 것을 필드중 name으로 변경하겠다고 선언한다.
class House(models.Model):
"""
Model for houses
"""
name = models.CharField(max_length=140)
price_per_night = models.PositiveIntegerField() #수정
address = models.CharField(max_length=140)
description = models.TextField()
pets_allowed = models.BooleanField(default=True) #추가
def __str__(self): # 글자로 보여지게 만들기
return self.name
나. admin페이지 수정
House모델을 admin페이지에서 보여지게 해주는 것은 admins.py파일이라고 했다. 그래서 해당 파일에 HouseAdmin이라는 클래스를 만들어 보여지는 것을 컨트롤 한다. 현재 데이터를 두건 입력한 모습이다.
이렇게만 나오면 이게 뭘 의미하는지 알기가 어렵다. 따라서, 컬럼과 필드, 검색창을 만들어준다. 이를 위해 admin.py에 아래와 같이 입력한다. list_display, list_filter, search_fields 라고 입력해 줘야 하는데 각각의 설명은 아래 주석에 작성되어 있다. 여기서 주의할 점은 장고에서는 값을 리스트나 튜플로 받아야 한다는 점이다. 그런데 튜플로 값을 받을 시 값을 하나만 입력하면 str로 인식한다. 따라서 뒤에 꼭 ','을 입력해 줘야 한다.
@admin.register(House)
class HouseAdmin(admin.ModelAdmin):
list_display = ('name', 'price_per_night', 'address', 'pets_allowed') # 컬럼으로 나타낼 필드
list_filter = ("price_per_night", "pets_allowed") # 필터로 사용할 필드
search_fields = ("address",) # 검색으로 활용할 필드 ***하나만 입력하려면 ',' 꼭 써주기
이외에도 admin과 model에 적용하는 fields에 대해서 django docs에 자세히 나와있다.
Django
The web framework for perfectionists with deadlines.
docs.djangoproject.com