터칭 데이터

장고(Django) 어드민으로 모델 등록하기 본문

장고 (Django)

장고(Django) 어드민으로 모델 등록하기

터칭 데이터 2023. 11. 1. 00:19

어드민(Admin) 페이지로 모델도 관리할 수 있다.

바로 지난 시간에는 어드민 페이지로 이용자를 만들고 관리했습니다.

사실 어드민 페이지는 이용자뿐만 아니라 우리가 장고로 만든 모델(테이블)들을 CRUD할 수 있습니다.

 

이를 어떻게 할 수 있을까요?

 

장고의 admin에 지난 시간 만든 모델들 Question과 Choice도 다룰 수 있게 적기만하면 됩니다.

 

 

 

 

 

어드민 페이지에 모델 등록하기

 

우리가 등록할 모델 Question과 Choice는 polls앱에 존재합니다.

polls 디렉토리에는 polls 앱 생성시 같이 자동생성 되었던 admin.py파일이 존재합니다.

이 admin.py 파일에 위와 같이 박스의 코드들을 적어줍니다.

 

from django.contrib import admin
from .models import *

# Register your models here.
admin.site.register(Question)

먼저 Question 모델을 인자로 admin.site.register에 인자로 줍니다.

(이미 주석으로 작성된 설명만 보더라도 모델을 등록하는 파일임을 알 수 있습니다.)

 

 

어드민 페이지에 Question 모델이 잘 등록되었는지 살펴봅시다.

 

 

어드민 페이지를 새로고침하면 POLLS앱의 Questions 모델이 새로 잘 등록되었음을 확인할 수 있습니다.

 

 

 

나머지 모델 Choice도 등록해줍니다.

admin에 Choice 모델도 등록을 해주면

 

 

이전과 마찬가지로 새로고침을 해주면 Choice 역시 잘 추가 되었습니다.

 

 

 

 

 

 

어드민 페이지에서 데이터 추가해보기

 

여기서 Qustions에 새로운 데이터(row)를 추가하기 위해 우측 상단의 ADD QUESTION + 를 눌러줍니다.

 

Question text라는 텍스트 입력란

Date published라는 날짜 입력 폼(Form)이 주어집니다.

 

 

 

 

우리가 이전에 만든 모델 객체가 어땠는지 다시 복기해보겠습니다.

 

polls/models.py

question_text 필드(컬럼)를 CharField로

pub_date 필드를 DateTimeField로 정의했기 때문에

 

어드민 페이지가 입력란을 필드 타입에 맞춰 제공해주는 것입니다.

어드민 페이지가 모델(테이블)의 관리에 왜 유용한지 알 수 있는 순간입니다.

 

 

 

 

어드민 페이지에서 제공된 입력폼에 새로운 question을 입력해 보겠습니다.

Today와 Now 버튼의 도움을 받아 날짜를 입력하고 '휴가를 어디서 보내고 싶으세요?'라는 질문을 Save로 저장합니다.

그리고 '가장 좋아하는 디저트는?'이라는 질문을 하나 더 저장해줍니다.

 

 

 

그리고 Questions 목록으로 돌아와보면

 

Question object(1)과 (2)가 추가되어 있는데

괄호안의 숫자는 장고가 모델을 마이그레이션, 테이블 생성시 자동으로 추가한 ID 칼럼 값입니다.

 

그런데 Question object(id값) 이런 형태의 표현은 질문이 무엇인지 파악하기가 힘듭니다.

Question의 제목과 날짜 표현해줍시다.

 

 

 

 

polls/models.py의 class Question에

class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')
    
    def __str__(self):
        return f'제목: {self.question_text}, 날짜: {self.pub_date}'

__str__ 메서드를 추가합니다.

__str__ 메서드는 객체를 print등의 문자열로 표현할 때 어떻게 표현할지 설정하는 메서드입니다.

 

 

 

 

어드민 페이지에서 새로고침을 하면

Question object(id)에서 더 보기 좋은 형태로 바뀌었음을 볼 수 있습니다.

 

 

 

 

 

 

 

 

모델을 수정하고 어드민 페이지에서 확인해보기

 

우리는 위에서

 

question_text 필드(컬럼)은 CharField로

pub_date 필드는 DateTimeField로 정의됐기 때문에

 

어드민 페이지가 입력란을 필드 타입에 맞춰 제공해준 것을 확인해 보았습니다.

 

다른 필드 타입들의 입력폼은 어드민 페이지에서 어떻게 제공될까요?

 

 

세가지 타입의 필드를 추가해보겠습니다.

1. Float

2. Boolean

3. JSON

 

 

polls/models.py

class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')
    score = models.FloatField(default=0) # 새로 추가 1
    is_something_wrong = models.BooleanField(default=False) # 새로 추가 2
    json_field = models.JSONField(default=dict) # 새로 추가 3
    
    def __str__(self):
        return f'제목: {self.question_text}, 날짜: {self.pub_date}'

위와 같이 Question 모델에 필드를 3개 추가해줍니다. (주석이 달린 코드 3줄을 추가)

 

 

 

모델을 수정했으니 당연히 마이그레이션을 만들어주고 이를 마이그레이트해줍니다.

 

서버는 계속 실행시킨 상태에서

터미널로 파이썬 가상환경에 접속해 mysite 프로젝트(디렉토리)로 이동합니다.

(cmd 창을 2개 켜서 하나는 서버를 계속 실행, 나머지는 마이그레이션을 위한 명령을 내린다.)

 

 

(DjangoProjects) C:\Users\User\DjangoProjects\Scripts\mysite>python manage.py makemigrations

마이그레이션을 만들어줍니다.

 

Migrations for 'polls':
  polls\migrations\0002_question_is_something_wrong_question_json_field_and_more.py
    - Add field is_something_wrong to question
    - Add field json_field to question
    - Add field score to question

필드 3개가 추가되는 마이그레이션이 잘 만들어졌습니다.

 

 

 

마이그레이트를 해줍니다.

(DjangoProjects) C:\Users\User\DjangoProjects\Scripts\mysite>python manage.py migrate

 

Operations to perform:
  Apply all migrations: admin, auth, contenttypes, polls, sessions
Running migrations:
  Applying polls.0002_question_is_something_wrong_question_json_field_and_more... OK

마이그레이트가 잘 수행되었습니다.

 

 

 

 

어드민 페이지에서 확인해 볼까요?

 

 

Float 타입의 Score,

Boolean 타입의 Is something wrong 체크 박스

JSON 타입의 Json filed 입력란

 

3가지가 위와 같은 입력폼으로 제공되는 모습입니다.

 

주의) 어드민 페이지에서 JSON 타입의 키와 값을 입력할 때는

{"key": 100}

위와 같이 키값을 " 쌍따옴표로 묶어줘야 에러가 나지 않습니다.

 

 

 

 

 

 

 

 

모델을 수정하고 어드민 페이지에서 확인하기

 

Question 모델에 추가한 필드 타입 3개를 삭제합니다.

즉 Question 모델을 다시 수정한다는 뜻입니다.

 

필드 타입 3개를 추가할 때는 migrations 번호가 0002였습니다.

그렇다면 저번에 모델을 수정했을 때처럼 0001로 돌아가면 될 것입니다.

 

 

(DjangoProjects) C:\Users\User\DjangoProjects\Scripts\mysite>python manage.py migrate polls 0001

마이그레이션 0001로 돌아가겠다 명령을 내립니다.

 

Operations to perform:
  Target specific migration: 0001_initial, from polls
Running migrations:
  Rendering model states... DONE
  Unapplying polls.0002_question_is_something_wrong_question_json_field_and_more... OK

잘 수행되었으니 어드민 페이지에서 새로고침을 해봅시다.

 

 

 

 

 

어드민 페이지를 새로고침하면

에러가 뜹니다!

 

polls앱의 question테이블에 score라는 컬럼이 없어서 에러를 띄웠다고 합니다.

 

어드민 페이지에서 모델에 정의된 내용을 DB에서 읽어 오려고 하는데 못 읽어 왔기 때문입니다.

우리가 0002에서 0001로 마이그레이션을 취소했기 때문입니다.

 

하필 에러 메시지가 'score 컬럼이 없다'로 뜨는 이유는 우리가 models.py에서 새로운 필드들을 추가할 때 가장 먼저

추가하도록 코드를 작성한 필드가 score였기 때문입니다.

 

polls.models.py에서 추가했던 필드들을 지워줍니다.

 

 

 

 

그리고 다음에 마이그레이트를 실행할 때 0002 마이그레이션이 다시 수행돼 필드 3개가 다시 추가되는 일이 없도록

 

0002 파일을 삭제합니다.

 

 

 

 

 

어드민에 필드를 추가하고 삭제하는 방법과

모델을 수정하고 어드민에서 확인하는 방법에 대해 살펴봤습니다.