Python/Do Something

python(django) - 장고로 웹페이지 만들기, models, database (5)

pybi 2023. 1. 17. 20:51

 

 

이전 편에서는 bootstrap을 통해 웹페이지의 Navigator, 본문 넣기, modal, footer 등을 추가했다.

 

하지만 이렇게 페이지를 만들 경우 사용자는 페이지의 단순한 내용 업데이트를 위해 html을 계속 수정해야 한다. 그럴수는 없으니 db에 data를 넣고 해당 내용을 불러오는 것을 해보자.

여기서부터는 복잡하니 간단히 요약해보고 하나하나 진행해보겠다.

1. models.py 설정

2. sqlite3 설명 및 migate

3. data추가 페이지 만들기(admin)

4. image와 file upload 기능

 

==========================================================================================

1. models.py 설정

방식은 이전에 FBV CBV 중에서 CBV로 해보려고 한다.

우선 django image control을 위한 pillow를 설치하자.

(pymin_django2) PS C:\pyminv\pymin_django2> pip install Pillow==9.1.1

 

 

다음으로 이전 편에서 만들었던 blog app의 models.py를 열고 함수를 추가해보자.

(C:\pyminv\pymin_django2\blog\models.py)

from django.db import models

class Post(models.Model):
    title = models.CharField(max_length=30)
    hook_text = models.CharField(max_length=100, blank=True)
    content = models.TextField()
    head_image = models.ImageField(upload_to='blog/images/%Y/%m/%d/', blank=True)
    file_upload = models.FileField(upload_to='blog/files/%Y/%m/%d/', blank=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return f'[{self.pk}] {self.title} - {self.hook_text}'

 

models.py에 database 내용을 추가했지만 아직 db에 반영된것은 아니다. 어떻게 반영되는건지 확인해보자.

 

 

2. sqlite3 설명 및 migate

우선 프로젝트 최상위 폴더로 가면 db.sqlite3 파일이 있을 거다. 대규모 프로젝트를 할것이 아니기 때문에 mysql 등 db보단 onefile 형식의 sqlite3면 충분하다.

이제 아래 사이트에 접속해본다. (sqlite3 viewer 를 설치해도 되지만 간단하게 web에서 확인하자)

https://sqliteviewer.app/#/db.sqlite3/table/auth_user/

 

SQLite Viewer Web App

SQLite Viewer Web App SQLite Viewer Web is a free, web-based SQLite Explorer, inspired by DB Browser for SQLite and Airtable. Use this web-based SQLite Tool to quickly and easily inspect .sqlite files. Your data stays private: Everything is done client-sid

sqliteviewer.app

 

 

사이트에 접속하면 아래와 같이 나온다. 여기에 sqlite3 파일을 옮겨보자.

 

 

sqlite3 파일을 옮기면 아래처럼 db table이 나타나고 auth_user에 이전에 만들었던 data가 있다.

 

이제 databse migration을 위해 아래 명령어를 입력해보자.

python manage.py makemigrations
python manage.py migrate

 

admin, auth, blog, contenttypes, sessions가 Apply되었다고 한다.

(pymin_django2) PS C:\pyminv\pymin_django2> python manage.py makemigrations
Migrations for 'blog':
  blog\migrations\0001_initial.py
    - Create model Post
(pymin_django2) PS C:\pyminv\pymin_django2> python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, blog, contenttypes, sessions
Running migrations:
  Applying blog.0001_initial... OK
(pymin_django2) PS C:\pyminv\pymin_django2>

 

 

이제 다시 sqlite3를 볼수있는 웹사이트에 sqlite3 파일을 옮겨보자. 왼쪽 제일 아래에 blog_post라는 table이 만들어지고 그안에는 models.py에서 생성한 컬럼들이 있다. 이렇게 models.py를 변경할때는 migrate를 해주어야 반영이 된다.

 

 

3. data추가 페이지 만들기(admin)

일반적인 blog의 글쓰기처럼 data를 넣을 페이지를 만들어야 한다. 이걸 하려면 form을 이용하고 별도의 html 파일도 만들어야 하기 때문에 더 복잡해진다. 그렇기 때문에 우선 django의 좋은 기능을 사용하고. data를 넣을 별도 페이지를 만드는 것은 추후에 진행하도록 하자.

 

우선 blog app의 admin.py를 열고 아래 내용을 추가하자. 이전에 확인했던 admin page에 post에 대한 내용을 보여주게 된다.

C:\pyminv\pymin_django2\blog\admin.py

from django.contrib import admin
from .models import Post

admin.site.register(Post)

 

 

이후 http://127.0.0.1:8000/admin/에 접속하면 이전과 달리 BLOG>Posts가 생겨져 있다.

 

Posts를 누르고 ADD POST를 누르면 아래와 같이 data를 추가할 수 있는 화면이 나오고 원하는대로 Title, Hook text, Content를 추가해보자. (image와 file은 아직 추가하지 말자)

 

 

 

그럼 이제 내가 처름으로 쓴 글을 확인할 수 있다.

당연한 거겠지만 아까 확인했던 sqlite3 파일을 웹에 올려보면 blog_post table 내에 내가 추가한 내용이 있다. django가 이런 부분에서는 정말 편하다.

 

 

 

4. image와 file upload 기능

그럼 이제 image와 file을 upload할 수 있는 기능을 추가해보자.

최상위 디렉토리에 '_media' 라는 폴더를 만들고 그 안에 다시 blog란 폴더를 만든다. 그리고 그안에 다시 files 폴더와 images 폴더를 만들면 된다.

C:\pyminv\pymin_django2\_media\blog

 

 

처음 models.py에 image/file의 저장 경로를 추가했으니 다시 admin page에서 file_upload, image_upload를 하면 db에 경로가 추가가 된다. 하지만 해당 디렉토리에 가보면 실제 파일은 없다. 왜그럴까?

    head_image = models.ImageField(upload_to='blog/images/%Y/%m/%d/', blank=True)
    file_upload = models.FileField(upload_to='blog/files/%Y/%m/%d/', blank=True)

 

 

다음으로 처음 만들었던 프로젝트 디렉토리에 있는 settings.py에 media 저장 경로를 추가해야 한다. 

C:\pymin_j\pymin_j\settings.py

 

파일을 열고 제일 아래에 아래 내용을 추가한다. (제일 위에 import os도 추가)

### 파일 저장을 위한 경로
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, '_media')

 

 

이제 다시 admin page에서 file과 iamge를 upload 해보자. 내가 원하는 경로에 image와 file이 저장되어 있는 것을 확인할 수 있다.

 

 

여기까지 하면 django admin page를 통해서 내가 원하는 컨텐츠를 db에 넣고  image와 파일을 upload하는 것까지 끝이다. form을 이용한 별도 page를 만들지 않으니 편하다. (하지만 admin page이므로 나중에 필요한 사람이 있다면 form 을 이용한 방법도 추가해보겠다/댓글주세요..)

 

 

이제 database에 여러가지 정보를 저장했으니 이를 불러들여서 보여주도록 설정해야 한다. 어떻게 할까? 보여주는 거니 views.py랑 html을 건드리면 되지 않을까.. 이부분은 다음 편에 계속