본문 바로가기
개발/Django_python 웹 프레임워크

Django - Model & admin

by 자유로운 코끼리 2020. 7. 6.
728x90

오늘은 MTV 패턴에서 Model에 대해서 공부해보겠습니다.

주요 포인트는 다음과 같습니다.

 

1) Model에 데이터를 어떻게 담을 것인가

2) Model의 데이터를 어떻게 View로 넘길 것인가

3) 이러한 데이터를 어떻게 Template 화면에 띄울 것인가

 

1. Model에 데이터를 어떻게 담을 것인가

Model이란?

Model은 데이터베이스를 다루는 친구입니다.

우리가 특정 웹 사이트에 회원가입을 하거나, 글을 쓰게 되면 그 정보가 서버컴퓨터의 DB에 저장되고,

이 데이터가 사용자의 요청에 따라 View를 통해 처리되어 Template에 보여지게 됩니다.

즉, 사용자들이 적은 데이터를 저장하고 보관하다가, 요청되어질 때 꺼내주는 곳입니다.

 

이때  Models.py에서는

가공되었으면 하는 종류는 무엇인지,

어떤 정보가 처리되었으면 좋겠는 지를 Class로 다루어줍니다.

 

Class는 객체의 틀이라고 했었죠? 여러 객체를 찍어내기 위한 붕어빵 틀!

제목, 날짜, 본문을 찍어낼 수 있는 Class를 만들어 볼거에요.

그렇게 되면 이 클래스를 호출하기만 하면 만든 틀대로 제목, 날자, 본문이 담긴 데이터(객체)들이 생성됩니다.

이렇게 Class는 틀처럼 여러 객체를 찍어낼 수 있가에 우리는 이를 사용합니다.

 

이때 Class명을 지을때에는 꼭 첫글자를 대문자로 지어야 합니다.

개발자 간의 약속이에요:).

class Blog(models.Model):
    title = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')
    body = models.TextField()

뭔가 알 수 없는 것들 투성이죠?

우선 models.Model이라는 인자를 받아줄 겁니다.

이 인자에 대해서는 잘 몰라도 되니 우선 진행해보죠.

 

그리고 ~Field라는 아이들은 장고와 DB에게 어떤 종류의 데이터를 저장할 것인지 알려주는 아이들이에요.

 

title,pub_date,body는 이름으로 모델의 속성을 만들어줄거에요.

1. title이라는 변수에 model에 있는 CharField라는 제한된 문자열 필드 타입을 이용하여 정의해주겠다는 의미입니다.

이때 CharField는 최대 길이(max-lenght)를 정해주어야 합니다. 저는 최대 길이를 200인 문자열을 만들어 주었습니다.

2. pub_data 변수에다가는(속성) DateTimeField를 이용하여 날짜와 시간을 설정해줄 거에요.

날짜만 가질 경우는 DateField, 시간만 가질 경우는 TimeField를 사용합니다.

3. body라는 변수에다가는 TextField를 이용해줄건데, 이는 CharField보다는 조금 더 긴 문자열을 저장해주는 필드라고 생각하시면 됩니다.

 

이렇듯 쟝고 모델에서 db 테이블을 만들 때,

models.~~Field로 각 변수의 데이터 종류를 설정해준다고 생각하시면 편할 것 같습니다.

 

이때 데이터베이스(DB)는 쟝고와 별개의 것으로, 여러 개를 만들어 줄 수 있습니다.

예를 들어 유저 정보를 저장하는 DB, 사람들의 게시물을 저장하는 DB 등으로요.

쟝고는 기본적으로 sqlite3를 제공하지만,

원하는 것에 따라  MySQL, PostgreSQL 등을 연결하 수 있습니다.

이는 settings.py에 정의되어 있고, 바꾸어 줄 수 있습니다.

 

Migrations

그런데 이렇게 별도의 프로그램이기 때문에 models.py에서 class를 만들게 되면

이를 DB에 알려주어야 합니다.

 

Migrations은 models.py에서 바꾼 내용을 데이터베이스 스키마에 보내는 장고의 방법이다. 

 

Djando는 Python으로 작동하는 웹 프레임워크라, 파이썬을 이해하지만 DB는 그렇지 않습니다.

파이썬코드를 DB가 이해할 수 있게 번역해주는 작업이 필요하고,

터미널에 입력할 명령어는 다음과 같습니다.

python manage.py makemigrations

이는  models에 적용한 변화를 기반으로 새로운 migrations를 만들어냅니다.

각 class를 테이블을 만드는 SQL command로 만들어준거죠.

입력 후에 django migrations 디렉토리에 0001.initial.py과 같은 파일이 만들어진 것을 확인할 수 있습니다.

 

그리고 번역된 내용을 DB에 적용하는 것이 다음 명령어입니다.

python manage.py migrate

처음으로 migrate를 하면 root directory에 db.sqlite3 라는 폴더가 생깁니다.

migrate는 migraions에서 만들어진 SQL command를 사용해서 데이터베이스에 테이블을 만드는 것이라고 보면 되는거죠.

 

 

admin 페이지

admin 페이지는 사이트 관리자를 위한 페이지로, 컨텐츠를 편집할 수 있는 통합적인 인터페이스를 제공합니다.

쟝고의 특징이기도 하죠.

 

url 뒤 /admin을 붙여주면 관리자 페이지를 보실 수 있을텐데요.

어? 로그인 페이지가 있네요!

 

관리자(admin)계정 만들기

최고 대빵 관리자를 이제 다시 등록해주러 가봅시다!

켰던 서버를 꺼준 후, admin을 만드는 명령어를 터미널에 입력해봅시다.

python manage.py createsuperuser

슈퍼유저를 등록하는 명령어입니다.

입력해달라는 거 다 해주고,

password입력 시 아무것도 나오지 않는 것이 정상이니 당황하실 필요 없습니다:>

 

Superuser created successfully.

라는 아이가 나타나면 잘 생성된 것입니다.

 

등록 후, 다시 서버를 켜 admin 페이지에 가서 아이디와 비밀번호를 입력해주시면 됩니다.

이 사이트는 데이터를 추가하는 등, 전체 데이터를 관리할 수 있는 곳입니다.

그런데 아직 아까 만든 blog가 보이지 않습니다.

왜냐하면 django에게는 우리가 blog model을 만들었다는 걸 migrate를 통해 알렸지만,

admin에게는 알려주지 않았기 때문입니다.

 

admin에 model 등록하기

admin.py라는 파일에 들어가 다음과 같은 명령어를 입력해줍니다.

from .models import Blog

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

첫째줄은 '같은 폴더위치에 있는 models 라는 파일에, Blog 라는 클래스를 가져오라'는 소리고,

맨 밑에 줄은 'admin에 Blog 라는 클래스를 등록해라'라는 말입니다.

 

 

Admin 페이지에 Blog 글 제목이 보이도록 만들기

class Blog(models.Model):
    title = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')
    body = models.TextField()

    def __str__(self):
        return self.title

 

 

표준 시간 바꿔주기

Django 의 서버 시간은 settings.py  TIME_ZONE 변수에 입력된 표준시간 값을 사용합니다.

기본값으로는 협정 세계시를 뜻하는 UTC 가 입력되어있기에 우리의 시간과 다르게 뜨는 겁니다.
아래와 같이 입력하여 대한민국 시간으로 바꿔주면 됩니다.

TIME_ZONE = 'Asia/Seoul'

 

2. DB를 View에서 가져오기

우선 main.html을 만들어서 url에 등록해준 다음, 

views.py에 가서 main.html에 db 내용을 가져와주는 함수를 짜보도록 하겠습니다.

 

 

from django.shortcuts import render
from .models import Blog


def main(request):
    blogs = Blog.objects #모델로부터 객체의 목록을 전달, 쿼리셋
    return render(request, 'main.html', {'blogs': blogs})

우선 models 에 있는 Blog 클래스를 먼저 import 해줍니다.

그 다음 Blog에서 objects 메소드를 사용하여 모델의 객체들을 불러옵니다. 

이를 쿼리셋이라 합니다.

 

ModelName.object을 통해 성생가능합니다.

query 란 데이터베이스에 정보를 요청해주는 것을 의미하며

파이썬으로 작성한 코드가 sql 로 매핑되어 queryset 이라는 자료 형태로 값이 넘어오게 됩니다. 

 

이 쿼리셋을 메소드를 통해 가공해서 넘겨줄 수 있습니다.

ModelName.object.메소드 를 통해 다양한 기능을 이용할 수 있습니다.

3. Template에 출력하기

{{blogs}}

만 하면 다음과 같은 화면이 나올겁니다.

이는 myapp안에 있는 Blog라는 클래스의 객체야~ 라는 걸 말해주는데요.

우리는 안에 내용에 접근을 하고 싶은거니, 이와는 다르게 표현해줘야 겠죠?

{% for blog in blogs.all %}
    <h1> {{blog.title}} </h1> #클래스에 접근하는 기본적인 방법 클래스명.속성
    <p> {{blog.pub_date}} </p>
    <p> {{blog.body}} </p>
    <br><br>
{% endfor %}

blogs라는 쿼리셋에 .all이라는 메소드를 이용하면,  모델에 저장되어있는 객체를 모두 다 불러와줄 수 있기에,

내가 작성한 모든 글이 담기게 됩니다.

이를 하나씩 blog라는 변수에 넣게 되는거죠. 한번 부를 때 마다 내가 작성한 글 하나가 blog에 들어가게 되겠죠?

댓글