본문 바로가기
Web/Django, Bootstrap

[Blog 만들기] #4 FBV 방식, CBV 방식

by 파크영 2022. 4. 5.

※ Do it! 장고 + 부트스트랩 파이썬 웹 개발의 정석(이성용, 김태곤 / 이지스퍼블리싱) 책을 참고하여 프로젝트를 진행하고 있습니다.

프로젝트 진행과정을 기록하기 위해 작성하고 있으므로 책 저작권을 위해서 간단한 내용 외 자세한 코드와 내용은 작성하지 않습니다.

 

 

views.py

urls.py에 들어갈 함수나 클래스 등 정의한다. 

views 구현하는 두가지 방식 : FBV, CBV

 

 

FBV(Function based view)

함수에 기반을 둔 방법. 함수를 직접 만들어 원하는 기능을 직접 구현

 

  • blog/views.py (FBV방식)
# blog/views.py FBV방식 구현
from django.shortcuts import render
from .models import Post    # views.py에서 DB에 쿼리를 날려 원하는 레코드 가져옴

def index(request):
    posts = Post.objects.all().order_by('-pk')  # 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,
        }
    )

 

  • blog/urls.py (FBV방식)

 

from django.urls import path
from . import views     # views.py를 사용할 수 있게 하는 코드

# url과 url이 들어왔을 때 처리 방법 명시
urlpatterns = [
    path('<int:pk>/', views.single_post_page),  # /blog/뒤에 정수가 붙는다면 views.py의 single_post_page()함수에 정의 된 대로 처리
    path('', views.index)   # 도메인 뒤에 /blog/가 붙는다면 views.py의 index()함수에 정의 된 대로 처리
]

 

 

 

 

CBV(Class based view)

장고가 제공하는 클래스를 활용해 구현하는 방법

(장고는 웹 개발 할 때 반복적으로 많이 구현하는 것들을 클래스로 미리 만들어서 제공하고 있다.)

 

 

  • blog/views.py (CBV방식)

 

from django.views.generic import ListView   # 장고에서 제공하는 ListView 사용할 것이다.
from .models import Post    # views.py에서 DB에 쿼리를 날려 원하는 레코드 가져옴


class PostList(ListView):	# 포스트 목록 페이지
    model = Post
    ordering = '-pk'    # 역순 정렬
    
  # 이 코드를 적지 않으면 post_list.html을 기본으로 찾는다.
  #  template_name = 'blog/index.html'
  
 class PostDetail(DetailView):	# 포스트 상세 페이지
    model = Post

 

  • blog/urls.py (CBV방식)
from django.urls import path
from . import views     # views.py를 사용할 수 있게 하는 코드

# url과 url이 들어왔을 때 처리 방법 명시
urlpatterns = [
    path('<int:pk>/', views.PostDetail.as_view()),
    path('', views.PostList.as_view()),

 

  • blog/templates/blog/post_list.html (index.html) (CBV방식)

post_list.html(index.html) 코드는 FBV와 CBV방식이 for문안에 posts(FBV), post_list(CBV)만 제외하고는 동일

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <title>Blog</title>
</head>
<body>
    <h1>Blog</h1>
<!--post 레코드 나열-->
{% for p in post_list %}
    <hr/>
    <h2><a href="{{ p.get_absolute_url }}">{{ p.title }}</a></h2>    <!--post 제목 클릭하면 post 화면으로 이동 blog/models.py에 함수 생성-->
    <h4>{{ p.created_at }}</h4>     <!--post 시간-->
    <p>{{ p.content }}</p>  <!--post 내용-->
{% endfor %}
</body>
</html>

 

위와 같이 FBV방식을 CBV방식으로 구현하면 간단하게 사용할 수 있다. 

 

 

 


  • 포스트 목록 페이지 (도메인/blog/)

 

 

  • 포스트 상세 페이지 (도메인/blog/정수/)

댓글