FBV(Function based view)는 말 그대로 함수에 기반을 둔 페이지를 뜻한다. 이 방식은 함수를 직접 만들어서 원하는 기능을 직접 구현할 수 있는 장점이 있다. CBV(Class based view)는 장고가 제공하는 클래스를 활용해 구현하는 방법이다. 장고는 웹 개발을 할 때 반복적으로 많이 구현하는 것들을 클래스로 미리 만들어서 제공하고 있어서 편하게 만들 수 있다.
from django.views.generic import ListView, DetailView
from .models import Post
# FBV방식
def index(request):
posts = Post.objects.all().order_by('-pk')
return render(
request,
'blog/index.html',
{
'posts': posts
}
)
def single_post_page(request, pk):
post = Post.objects.get(pk=pk)
return render(
request,
'blog/single_post_page.html',
{
'post' : post
}
)
# CBV방식
class PostList(ListView):
model = Post
ordering = '-pk'
class PostDetail(DetailView):
model = Post
from django.urls import path
from . import views
urlpatterns = [
# FBV방식
path('<int:pk>/', views.single_post_page),
path('', views.index)
# CBV방식
path('', views.PostList.as_view()),
path('<int:pk>/', views.PostDetail.as_view()),
]
FBV방식은 views에서 정의한 함수를 이용해 html과 query 레코드를 전달하는 것을 알 수 있고
CBV방식은 views에 정의한 View 클래스를 이용해 전달하는 것을 알 수 있다.
그리고 CBV방식으로 클래스를 작성하면 template_name 생성 규칙에 의해
PostList 클래스는 post_list.html에 대응되고 PostDetail 클래스는 post_detail.html에 대응된다.
이렇게 사용하지 않을 경우 클래스 멤버 변수인 template_name을 따로 지정해줘야 한다.