CBV로 페이지 만들기

Posted on 2021-08-25 by GKSRUDTN99
Django로 웹사이트 만들기 장고

장고는 웹 개발할 때 사람들이 반복해서 사용하는 기능들을 클래스 형태로 미리 제공한다.
이 클래스 들을 활용하여 페이지를 만드는 것을 CBV(Class Based Views)라 한다.

CBV로 포스트 목록 페이지 만들기

우선, blog/views.py의 index 함수를 삭제한다. ListView 클래스를 import 한 뒤, views.py 파일을 다음과 같이 작성한다.

# blog/views.py
from django.shortcuts import render
from django.views.generic import ListView
from .models import Post

class PostList(ListView):
    model = Post

...

blog/urls.py 수정

# blog/urls.py

...

urlpatterns = [
path('', views.PostList.as_view()),
path('<int:pk>/', views.single_post_page),
]

장고에서 제공하는 ListView는 모델명 뒤에 '_list'가 붙은 html파일을 기본 템플릿으로 사용하므로, blog/templates/blog/index.html 파일의 이름을 변경한다.
이전에는 index.html에 Post 모델 레코드들을 딕셔너리를 이용해 posts라는. 이름의 배열로 전달했지만,
ListView는 레코드들을 자동으로 'object_list' 또는 'post_list'라는 배열에 담아 전달해준다.
이에 맞게 index.html 파일을 수정한다.

# blog/templates/blog/post_list.html
<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <title>Blog</title>
</head>
<body>
    <h1>Blog</h1>
{% for p in post_list %}
    <hr />
    <h2><a href={{ p.get_absolute_url }}>{{ p.title }}</a></h2>
    <h4>{{ p.creatd_at}}</h4>
    <p>{{ p.content }}</p>
{% endfor %}
</body>
</html>

ListView도 FBV와 마찬가지로 Ordering을 적용할 수 있다.
pk를 기준으로 내림차순으로 정렬하기를 원하므로, 다음과 같이 작성한다.

# blog/views.py

class PostView(ListView):
    model = Post
    ordering = '-pk'

CBV로 포스트 상세 페이지 만들기

장고는 상세 페이지를 위한 DetailView 클래스를 제공한다. 이전의 single_post_page 함수를 삭제하고, 다음과 같이 수정한다.

# blog/views.py

from django.shortcuts import render
from django.views.generic import ListView, DetailView
from .models import Post


class PostList(ListView):
    model = Post
    ordering = '-pk'


class PostDetail(DetailView):
    model = Post

이에 맞게 blog/urls.py 파일도 수정한다.

# blog/urls.py

...

urlpatterns = [
    path('<int:pk>/', views.PostDetail.as_view()),
    path('', views.PostList.as_view()),
]

위의 ListView와 마찬가지로 DetailView도 기본 템플릿 파일명이 지정되어 있다.
'모델명_detail.html'에 맞게 single_post_page.html을 post_detail.html로 이름을 변경한다.