본문 바로가기
back-end/python&django

[django 기초] 장고의 model과 admin 다루기

by MOOB 2022. 1. 20.

 

model

데이터베이스에 저장될 테이블을 정의한다. 테이블은 models.py에서 정의되며 테이블을 하나의 클래스로 정의하고 테이블의 컬럼은 클레스의 변수(속성)으로 매핑한다.

  • CharField() : 길이 지정이 필요한 문자열
  • IntegerField() : 정수형을 받을 수 있는 타입
  • TextField() : 길이 지정이 필요 없는 문자열
#출처 : 파이썬 페이스북 클론 (인프런)

from django.db import models

class Notice(models.Model):
    title = models.CharField(max_length=200)
    likedCount.= models.IntegerField()
    view = models.IntegerField()
    contents = models.TextField()

이렇게 정의한 것을 DB에 생성시켜 주기 위해서는 migration 을 해 주어야 한다.

python manage.py makemigrations

반영이 되면 다음과 같이 모델이 생성되었다는 말과 함께 [models.py](http://models.py) 를 수정한 애플리케이션 폴더 내에 migration 이라는 폴더가 생성되게 된다.

그 다음 이것을 DB에 반영해주는 작업이 필요하다. 다음 코드를 입력해주자.

python manage.py migrate

이제 [admin.py](http://admin.py) 를 수정해 보자. 방금 작성한 Notice 를 다음과 같이 등록해주면 이제 admin에서 다음과 같이 나타난다.

from django.contrib import admin
from .models import Notice
# Register your models here.

admin.site.register(Notice)

이제 Add 버튼을 눌러주면 방금 전에 생성했던 model을 admin 페이지에서 등록할 수 있다.

완전 짱이다. 굿굿. 👍

 

여기에 임시로 데이터를 채워서 등록해보자. 그러면 다음과 같이 나타나게 될 것이다. 우리가 비록 Title 이라는 데이터를 만들었지만 DB는 얘가 타이틀인지 모르기 때문이다.

이제 이것을 우리가 정한 Title이 나타나도록 해주기 위해 [models.py](http://models.py)__str__ 로 정의해준다.

class Notice(models.Model):
    title = models.CharField(max_length=200)
    likedCount= models.IntegerField()
    view = models.IntegerField()
    contents = models.TextField()

    def __str__(self):
        return self.title

뭔가 진짜 개발자 같구나. 짱짱.

만약! likedCount를 같이 보고 싶다면 어떻게 해야할까? 다음과 같이 변경해보자. 짱

~

def __str__(self):
        return f'{self.title}:{self.likedCount}'

그런데 사실 우리는 이런 표현을 원하지 않는다. 리스트에 따로 따로 이걸 표시해줘야지... 그러면 [admin.py](http://admin.py) 를 다시 수정해주자. 앞에서 했던 admin.site.register(Notice) 를 삭제하고 다음 코드를 입력해준다.

@admin.register(Notice)
class NoticeAdmin(admin.ModelAdmin):
    list_display=['title', 'likedCount']

그래 이게 DB지

~

만약 여기에서 likeCount도 링크로 처리하고 싶다면 밑에 다음 구문을 추가해주면 된다.

list_display_links=['title', 'likedCount']

 

댓글