CBV로 페이지 만들기
장고는 웹 개발할 때 사람들이 반복해서 사용하는 기능들을 클래스 형태로 미리 제공한다.
이 클래스 들을 활용하여 페이지를 만드는 것을 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로 이름을 변경한다.