[Do it! 장고 + 부트스트랩] 따라하기 - 4

THOVY·2022년 8월 23일
0

따라하기

목록 보기
20/20

시작 👊

모든 장고 프로젝트는 1개 이상의 앱으로 구성됩니다. 이 때 '앱'은 '특정한 기능을 수행하는 단위 모듈' 로 생각하면 됩니다. 예를 들어 블로그와 갤러리, 방명록의 3가지 기능을 갖는 웹사이트를 만들 때는 일반적으로 3개의 앱을 만들어 개발하고 관리합니다. 물론 앱의 개수는 상황에 따라 개발자 스스로 선택해야 할 문제 입니다. 이 프로젝트에서는 2개의 앱을 만듭니다. 하나는 블로그 기능을 위한 BLOG 앱이고 또 다른 하나는 대문 페이지와 자기 소개 페이지를 보여주기 위한 single_pages 앱입니다.

블로그 앱과 페이지 앱 만들기

가상환경 실행

  1. 늘 그렇듯 cmder 을 켜 venv 가 실행되고 있는지 확인하고,
    python manage.py startapp blog 를 입력한다.

  2. ls 를 이용해 생성을 확인해본다.

  3. python manage.py startapp single_pages 도 입력한다.

  4. `ls' 를 이용해 생성을 확인해본다.

  5. 파이참을 확인해보자.

각 폴더에는 admin.py,apps.py,models.py,tests.py,views.py 같은 파일이 생성되어 있습니다. 이처럼 앱은 각각 독립된 파일로 구성되어 독립된 기능을 합니다. 앞으로 이 파일들을 수정하며 웹사이트를 만들어 나갈 것입니다.

두근..!

commit time!

두 앱을 만들었으니 커밋하자.

  1. git add .
  2. git commit -m "메세지"
    ' 으로 메세지 적으면 안되는 구나...😔

  3. git status 로 확인 후 git push


    확인.

깨끗한 상태의 migrations 폴더를 커밋한 이유가 뭔가요?

"아무작업도 하지 않았는데 왜 커밋하나요?" 라는 의문이 생길 수 있습니다.
커밋하는 이유는 모델이 생성, 수정 될 때마다 앱의 migrations 폴더에 자동으로 새로운 마이그레이션 파일이 생성되기 때문입니다.


모델이 생성, 수정되면 앱의 데이터베이스 구조가 변경됩니다. 그러면 장고는 변화 내용을 migrations 폴더에 별도로 남겨 기록합니다. 이건 로컬 작업에 필요한 것으로 서버 작업에는 필요 없습니다(오히려 서버작업에 혼란을 야기시킵니다).

데이터베이스의 개념

나는 데이터베이스에 대해 익히 (들어만 보고, 조금) 알고 있으므로 간략하게만 적어야겠다.
고유한 필드이며, 보통 자동으로 부여하는 primiary key 기본키
다른 테이블에서 참조되어 들어온 foreign key 외래키

엥 끝이네?

모델 만들기

장고의 장점 중 하나는 모델을 이용해 장고 웹 프레임워크 안에서 데이터베이스를 관리할 수 있다는 것입니다. 모델은 데이터를 저장하기 위한 하나의 단위라고 보면 됩니다. 일반적으로 데이터베이스를 다루려면 SQL 등의 언어를 또 배워야 하는데, 이는 웹 개발 입문자에게 진입장벽으로 작용할 수 있습니다. 장고의 모델을 이용하면 파이썬만으로 CRUD 기능을 쉽게 구현할 수있을 뿐만 아니라 관리자 페이지, 입력 폼 등도 쉽게 만들 수 있습니다.

블로그 글을 위한 모델

Post (게시글) 모델

Post 에는 어떤 정보가 필요한가!

  • title
  • content
  • created_at(작성일자)
  • author
  1. blog 에 있는 models.py 를 얼어 코드를 입력한다.
from django.db import models

class Post(models.Model):
    title = models.CharField(max_length=30)
    content = models.TextField()
    # content 라고 하기 싫고 article 이라고 하고 싶은데 나중에 헷갈릴까봐 이렇게 한다.
    # 과제할 때는 article 이라고 해야겠다.
    
    created_at = models.DateTimeField()
    # author 는 추후에 작성

CharField 는 문자(Char) 를 담는 필드를 만듭니다.
content 는 문자열의 길이 제한이 없는 Textfield를 사용해서 만들었고,
create_at 필드는 DateTimeField 로 만듭니다.
DateTimeField 는 월,일,시,분,초 까지 기록 할 때 사용합니다.


왜 빨간 줄이..ㅎ

아직 Post 모델은 파이썬 클래스로만 존재합니다. 이를 데이터베ㅣ스에 반영해야 실제 테이블이 생성됩니다.

터미널에 python manage.py makemigrations 를 입력합니다.

No changes detected 라는 메세지가 나옵니다! 분명 models.py 를 수정했는데 왜 아무런 변화도 감지하지 못했을까요?

😭모르겠어요 빨리 알려주세요

프로젝트 폴더 안에 있는 settings.py 파일에 현재 우리의 blog 앱이 등록되지 않았기 때문입니다. 앱이 등록되지 않았으니 변경 사항을 모르는 것입니다.

아 에런 줄 알았네
아니지 에러가 맞네. 아니 왜 등록이 안 됐지?

settings.pyblog 앱 등록하기

settings.py 에는 INSTALLED_APPS 라는 리스트가 있습니다. 여기에 blog, single_pages 앱을 추가합니다.

다시 migration

다시 python manage.py makemigrations 를 입력하면

그리고 blog/migarations 폴더에 0001_initial.py 라는 파일이 생겼습니다.

하지만 이 상태는 데이터베이스에 모델이 적용되지 않은 상태입니다.

모델을 적용시키려면 python manage.py migrate 로 마이그래이션을 실행해야합니다.

0001_initial.py 는 버전 관리대상이 아님.

버전 관리 대상이 아니면 어떻게 해야돼?!

.gitignore 에 등록해야지!

한 번 post 를 작성해볼까?

python manage.py runserver 를 입력해 서버를 실행하고, 웹브라우저에서 admin 으로 접속해본다.

그대로네? 뭐 아무것도 없네?

그럼 만들어보자

다시 파이참으로 돌아가

  1. blogadmin.py 에 코드를 입력한다.
from django.contrib import admin
from .models import Post

admin.site.register(Post)

  1. 웹페이지를 새로고침 해보면!

짜잔 blog 라는 칸이 생겼다. 그 안에 Posts 라는 항목도 생겼다.

포스트를 작성해보자!

Posts 를 클릭해보면 이러게 나온다. 아직 포스트를 작성한 게 없어서 0posts 라고 나온다.

ADD POST 를 눌러 글을 작성해보자.

글을 작성 해버렸따..!

대단하지 않나요? models.pyPost 모델을 정의하고, admin.py 에 코드를 두 줄 추가한 것만으로 관리자 페이지에 새로운 포스트를 작성할 수 있는 기능이 추가되었씁니다!

포스트를 개선해보자!

지금 포스트를 작성하고 게시판?으로 돌아왔을 때 포스트의 제목이 보이지 않음.

제목이 보이면 그 글이 어떤 내용인지 직접 들어가 보지 않아도 쉽게 알 수 있을텐데 말이지요.

__str__() 함수로 포스트 제목과 번호 보여주기

Post 모델에 __str__() 함수를 선언하면 됩니다.

  1. Post 모델에 코드를 적어준다.
def __str__(self):
	return f'[{self.pk}],{self.title}'

  1. 저장하고 새로고침 해보자.

장고의 모델을 만들면 기본적으로 pk(primary key) 필드가 만들어집니다. 처음 생성하면 포스트에 pk 값으로 1이 자동으로 부여됩니다. 이렇게 자동으로 부여되는 값을 이용해 포스트의 제목과 번호를 문자열로 표현합니다.

시간 개선하기

지금 우리의 작성 시간과 게시글상의 작성시간이 다른 것 같다.

Note: You ar 9 hours ahead of sever time.

서버타임보다 9시간 빠른 곳에 있다는 이야기 같다.

고쳐보자

  1. setting.py 를 열어본다. TIME_ZONE = 'UTC' 라는 걸 찾는다.

  2. TIME_ZONE = 'Asia/Seoul' 로 바꾸고,
    USE_TZ = False 로 바꾼다.

  3. 새로고침 해본다.

그런데 자동으로 시간을 넣고 싶어!

그런데 이게 포스트를 작성할 때마다 버튼 두개를 눌러 시간을 입력하는 것도 일이지.
자동으로 포스트를 작성할 때의 시간이 입력되도록 하고 싶다.
수정된다면, 수정되는 시간도 기록되도록!

DateTimeField 에는 auto_nowauto_now_add 라는 설정이 있어 처음 레코드가 생성된 시점, 마지막으로 저장된 시점을 자동으로 저장할 수 있씁니다.

  1. models.py 에 가서 코드를 채워넣어보자.
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)

코드를 수정 했으니 이를 makemigrationsDjango 에 알려주고, migrate 로 데이터베이스에 반영해야합니다. 그리고 다시 서버를 실행합니다.

  1. ctrl + c 로 서버를 끈 다음
  2. python manage.py makemigrations 입력
  3. python manage.py migrate 입력
  4. python manage.py runserver 로 서버 다시 실행


이제 시간을 입력하는 부분이 없어진 걸 확인할 수 있다.

  1. 게시글을 저장한 뒤에 history 를 살펴보면

    이렇게 시간이 기록된 것을 볼 수 있다. added 는 처음 기록한 시간.
    Changed Content 를 보면 수정한 것이다.

Commit Time!

  1. git add .
  2. git commit -m "메세지"
  3. git push

번외

Django Shell 사용하기

Python 은 스크립트 기반의 언어이기 때문에 컴파일 과정 없이 한 줄씩 그때 그때 실행시킬 수 있다는 장점이 있습니다. 즉, 터미널에서 원하는 기능을 간단히 실행시킬 수 있다는 것이죠.

  1. ctrl + c 로 서버를 종료하고 python manage.py shell 을 입력해봅시다.
    아! 커밋하느라 종료해서 지금 다시 종료할 필요가 없구나.
    여기서 포스트의 작성 및 수정시각을 확인해보자.

  2. from blog.models import Post 를 입력해 임포트하고, p = Post.objects.last() 로 데이터베이스에서 Post 모델의 마지막 레코드(objects.last)를 가져와 p에 저장해보자.
  3. 이제 확인해보고 싶은 것들을 명령어로 입력해보면 됩니다.
    p.title

    p.created_at

    p.updated_at
  4. 끝내려면 exit()

추후에 더 참고하면 좋을 것 같은 : Django Shell

끝!

profile
BEAT A SHOTGUN

0개의 댓글