본문 바로가기
WEB/Django

[Django] FBV와 CBV

by snow_white 2022. 4. 10.

view를 작성하는 방법을 크게 FBV(Function based view)와 CBV(Class based view)가 있다. 지금까지 함수 기반으로 view 파일을 작성한 것이다.

지금부터는 CBV를 살펴보자.

장고가 기본적으로 많이 사용하는 것들을 class로 구현해놓았고, 우리는 복잡한 코드 없이도 이것을 사용하여 view 파일을 손쉽게 만들 수 있었다.

하지만 CBV가 자동화가 되고 자유도가 떨어지는 만큼 우리는 프로젝트에 맞는 것을 사용하는 것이 좋다. CBV는 제네릭 뷰라고도 불린다.

# c앱에 views.py

from django.shortcuts import render
from django.views.generic import ListView
from b.models import Blog

# def indexC(request):
#     return render(request, 'indexC.html')

class BlogList(ListView): #여기서 class명은 상관이 없습니다.
    model = Blog
    template_name = 'indexC.html'
# urls.py

from c.views import BlogList

urlpatterns = [
    #.. 중략 ..
    # path('cc/', indexC),
    path('cc/', BlogList.as_view()),
    #.. 중략 ..

여기서 blog_list는 models.py에 class 명에 따라 변경

# indexC.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <h1>hello world C</h1>
    {% for i in blog_list %}
        <h1>{{ i.title }}</h1>
        <p>{{ i.contents }}</p>
    {% endfor %}
</body>
</html>

수정

# c앱에 views.py

from django.shortcuts import render
from django.views.generic import ListView
from b.models import Blog

# def indexC(request):
#     return render(request, 'indexC.html')

class BlogList(ListView):
    model = Blog
    template_name = 'indexC.html'
    ordering = '-pk'

아래 공식 Django 소스를 참고

django/django

 

GitHub - django/django: The Web framework for perfectionists with deadlines.

The Web framework for perfectionists with deadlines. - GitHub - django/django: The Web framework for perfectionists with deadlines.

github.com

공식 홈페이지에 API reference

Built-in class-based views API | Django documentation | Django

 

Built-in class-based views API | Django documentation | Django

Django The web framework for perfectionists with deadlines. Overview Download Documentation News Community Code Issues About ♥ Donate

docs.djangoproject.com

앞에서 작성했었던 simple 게시판에 상세 페이지도 구현해보기

# c앱에 views.py

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

# def indexC(request):
#     return render(request, 'indexC.html')

class BlogList(ListView):
    model = Blog
    template_name = 'indexC.html' #class명_list.html 파일을 자동으로 찾음

class BlogDetail(DatailView):
    model = Blog
    template_name = 'indexCdetail.html' #class명_detail.html 파일을 자동으로 찾음
# indexCdetail.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <h1>hello world C</h1>
    <h1>{{ blog.title }}</h1>
    <p>{{ blog.contents }}</p>
</body>
</html>

Built-in class-based views API

'WEB > Django' 카테고리의 다른 글

[Django] url 개선  (0) 2022.04.10
[Django] ORM, Django Shell, QuerySet  (0) 2022.04.10
[Django] template language  (0) 2022.04.10
[Django] Django 구조와 MTV  (0) 2022.04.10
[Django] admin 페이지에 Notice 등록하기  (0) 2022.04.10

댓글