Django

모델 재설계

현재 글쓰기 페이지

  • 지금까지 만든 [글쓰기]의 버튼을 눌렀을 때의 화면은 다음과 같습니다.

 

  • 글쓰기 기능은 제대로 작동하지만 별로 형태가 예쁘지 않습니다.
    이를 예쁘게 꾸미지 않고 내버려 둔 이유가 있습니다.
     
  • 이유는 지금까지 우리가 만든 데이터베이스의 형태를 바꿀 것이기 때문입니다.
    지금까지는 간단히 모델을 설계하고 저장하는 것까지 실습한 것입니다.

     
  • 이제부터 바꿀 데이터베이스 모델의 형태는 다음과 같습니다.
  • 1) 제목
  • 2) 날짜 - 따로 입력하지 않고, 저장을 누르면 자동으로 입력
  • 3) 작성자
  • 4) 내용 - 단순히 글자만 적는 것이 아니라 글자의 색깔, 폰트, 크기 등을 꾸밀 수 있고, 이미지 파일을 업로드

 

  • 어떠신가요? 실제 블로그에 비하면 초라해 보일 수도 있겠으나, 나름대로 필수적인 요소들은 전부 포함되어 있습니다.

 

 

 

Admin Page - 블로그 객체 삭제

  • 관리자 페이지에 접속하여 블로그에 접속하여 봅시다.

 

  • 데이터베이스 모델을 수정하기 전에 지금까지 만들었던 블로그 객체들을 전부 삭제한 뒤, 모델을 재설계하도록 하겠습니다.
블로그 객체들을 모두 선택합니다.
[Action]에 [Delete selected blogs]를 선택합니다.
[Go}를 누릅니다.

 

[Yes, I'm sure]를 누릅니다.

 

모두 삭제되었습니다.

 

 

모델 재설계

  • 위에서 언급했던 대로 모델을 재설계하도록 하겠습니다.

 

먼저, [blogapp]-[migrations]에서 [__init__.py]를 제외한 모든 파일을 지워주세요.

 

[__init__.py]만 남아있습니다.

 

[Tools]-[Run manage.py Task]를 클릭합니다.

 

다음 명령어를 차례로 입력합니다.
makemigrations
migrate --fake
  • [migrate --fake] 명령을 해주어야 데이터베이스에 새로운 항목을 추가할 때 오류가 나지 않습니다. 

 

다음과 같이 수정하여 줍니다.
from django.db import models
from django.contrib.auth.models import User

# Create your models here.
class Blog(models.Model):
    title = models.CharField(max_length=100)
    pub_date = models.DateTimeField(auto_now_add=True)
    author = models.ForeignKey(User, on_delete=True, null=True, default=1)
    body = models.TextField()
  • 'title'은 그대로입니다.
  • 'pub_date'는 'auto_now_add=True'를 지정해주어 따로 작성자가 값을 입력하지 않아도 현재 시간에 맞춰서 입력됩니다.
  • 'author'는 작성자 항목으로 새로 추가하였습니다.
    설명하기 전에 먼저, 장고에서는 User 모델을 기본적으로 제공하고 있습니다. 
    ForeignKey는 외래키라는 뜻으로 새로 import한 User 객체를 지정해주었습니다.
    데이터베이스는 테이블마다 주키(Primary Key)가 있는데, 'author' 항목처럼 User 외래키를 설정하면 User 테이블의 주키를 참조하게 됩니다.

    즉, admin page에서 [Users]에 들어가면 우리가 설정한 관리자 계정이 등록되어 있는데,  우리는 이 계정 정보를 가져오고, 이 값을 바탕으로 하여 'author' 항목을 설정한 것입니다.

    또한 나머지 인자들은 User 테이블에서 값이 삭제되면 'author' 항목도 영향을 받아 삭제가 됩니다. 또한 기본값을 본인의 관리자 계정으로 설정하는 부분입니다.
  • 'body'는 아직 수정하지 않았고, 다음 토픽에서 수정하도록 하겠습니다.

 

 

 

 

forms.py 수정

 

  • 일단 'body'는 다음 토픽에서 수정하도록 하고, 지금까지 어떠한 변화가 있는지 확인하기 위해 [forms.py]를 수정하도록 합시다.
fields = ['title', 'author', 'body']
  •  원래 'pub_date'가 있었지만, 자동으로 입력이 되게 설정하였으므로 빼줍니다.
  • 또한 'author' 항목을 새로 추가한 것을 가져오도록 합니다.

 

 

[Tools]-[Run manage.py Task]를 클릭하고 명령어를 순서대로 입력합니다.
makemigrations
migrate

 

 

 

서버 실행 및 확인

  • 서버를 실행하여 [글쓰기]에 들어가서 제대로 적용이 되었는지 확인해 봅시다.
  • '날짜' 항목이 사라진 것을 알 수 있습니다.
  • 또한 '작성자' 항목이 추가로 나타났고, 기본 값으로 관리자 계정이 설정이 되어 있는 것이 보입니다.

 

 

  • 아무 내용이나 저장을 하고 admin 사이트에 가서 제대로 적용되었는지도 확인해 봅시다.

 

  • 성공입니다.

 

 

 

  • 다음 토픽에서는 body 내용을 좀 더 글을 다양한 형태로 쓸 수 있도록 적용해 보겠습니다.
     
  • 또한, 지금 날짜가 나타나지 않아서 제대로 저장되어 있는지 확인할 방법이 없지만 이는 나중에 설명해나가도록 하겠습니다.

 

 

 

 

댓글

댓글 본문
  1. dnrudzx
    찾아보니
    Django 2.2 버전에서 사용했던 문법이고
    지금은 on_delete에 True는 못넣는다고 하네요.
    가장 유사하게는 SET_DEFAULT 인듯한데 제가 이해한게 맞는지 모르겠네요...
    저는 여기서 참조했습니다.
    https://lee-seul.github.io......tml
  2. 예준
    https://www.inflearn.com......638
    검색해보니까 위에 링크에 나온 이유 때문인 것 같네요!
    대화보기
    • 몽롱해
      명령어 python manage.py makemigrations 를 입력하면

      TypeError: on_delete must be callable.
      라는 오류가 나옵니다.

      일단 해결방법으로
      author = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, default=1)

      이렇게 적으라는게 있어서 했더니 되긴하는데 괜찮은건가요?