본문 바로가기
[Framework] - Django

#2. django 모델 및 뷰 작성

by Bebsae 2020. 12. 28.

이번에는 모델과 뷰를 작성해볼 것이다. 일단 모델과 뷰가 무엇인지 간단하게 이해해보자.
 
Spring을 한 사람이라면 MVC (Model, View, Controller)라는 개념을 알 것이다. 여기에 django는 MTV (Model, Template, View)가 대응한다.
 
모델은 데이터베이스의 스키마를 정의하는 것이고, 뷰는 사용자의 요청에 따라 어떻게 처리할 것인지를 로직으로 구현한 부분이라고 생각하면 쉽다.
 
우선 우리는 두 가지의 모델(데이터베이스 테이블의 스키마)을 정의할 것이다.
 
polls/models.py

import datetime

from django.db import models
from django.utils import timezone

# Create your models here.
class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')

    def __str__(self):
        return self.question_text

    def was_published_recently(self):
        now = timezone.now()
        return now - datetime.timedelta(days=1) <= self.pub_date <= now


class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)

    def __str__(self):
        return self.choice_text

모델을 정의할 때에는 반드시 models.Model을 상속해주어야 한다. 
간단하게 각 모델에 대해 알아보자.
 
Question 모델은 두 가지의 속성을 지니고 있다.
question_text : 문자 속성, 최대길이 200
pub_date : 날짜 속성
 
Choice 모델은 세 가지의 속성을 지니고 있다.
question : 외래키, CASCADE (연쇄, 부모가 삭제되면 자식도 삭제)
choice_text : 문자 속성, 최대길이 200
votes : 정수 속성, 기본값 0
 
모델에 변동사항이 생겼으므로 새로운 마이그레이션을 생성하고 적용한다. 이 부분에 대한 내용은 dev-ryuon.tistory.com/7 에서 참고한다.
 
그리고 관리자 페이지에 생성한 모델들을 반영해야 한다.
polls/admin.py

from django.contrib import admin

from polls.models import Question
from polls.models import Choice

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

 
이어서 뷰를 작성해보겠다. 먼저 샘플을 작성해보자.
 
polls/views.py

from django.http import HttpResponse


def index(request):
    return HttpResponse("Hello, world. You're at the polls index.")

 
여기서 끝이 아니다. 사용자가 요청한 url을 우리가 작성한 뷰에 라우팅(연결)해야 한다.
polls 폴더 아래에 urls.py 를 생성하자. 이는 하나의 앱안에 각 url단위로 뷰들을 연결하기 위한 것이다.
 
그 다음, mysite 프로젝트에서 어떤 앱의 url을 참조할 것인지 추가시켜준다.
우리는 아까 생성한 polls 앱의 urls.py를 참조할 것이다.
 
mysite/urls.py

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('polls/', include('polls.urls'))
]

 
 
그리고 아까 샘플로 작성한 index 뷰를 연결할 것이다.
 
polls/urls.py

from django.urls import path

from . import views

urlpatterns = [
    path('', views.index, name='index'),
]

 
큰 맥락을 그림으로 보자.

URL 라우팅

맨 처음으로 path('polls/', include('polls.urls'))를 통해 polls/urls.py를 라우팅한다.
polls/urls.py에서는 views.py의 index FBV(Function Based View : 함수기반 뷰)를 라우팅한다.
 
각 path의 첫 번째 인자를 보면 'polls/' + '' = 'polls/' 경로가 조합되어 index 뷰를 띄우게 된다. 
127.0.0.1:8000/ 뒤에 오는 경로가 바로 위에서 조합된 경로이다.
 

index view

다음 포스트에서는 실제로 모델을 통해 의미있는 뷰를 작성해보겠다.

'[Framework] - Django' 카테고리의 다른 글

#1. django 서버 구동 및 관리자 페이지 탐방  (0) 2020.12.14
#0. Django 시작하기  (0) 2020.12.08

댓글