[Django] 클래스형 뷰를 통한 체계적인 뷰 만들기

[Django] 클래스형 뷰를 통한 체계적인 뷰 만들기

참고 자료 : https://docs.djangoproject.com/en/5.0/topics/class-based-views/intro/

클래스형 뷰(Class-based views)란?

장고에서 뷰를 만들 때 클래스 기반 뷰(Class-Based Views, CBVs)를 사용하는 것은 함수 기반 뷰(Function-Based Views, FBVs)에 비해 몇 가지 장점이 있습니다. 간단하게 설명하자면 더 크고 복잡한 어플리케이션을 만드는 과정에서 코드의 재사용성 및 가독성을 높이고 테스트를 용이하게 하려면 클래스 기반 뷰가 더 좋습니다. 먼저 클래스형 뷰 사용법에 대해 설명하겠습니다.

클래스형 뷰 사용하기

urls.py - as_view()메서드

views.py에서 클래스형 뷰를 만든다면 이 클래스에 접속하기 위해 장고에서 제공하는 as_view()메서드를 활용하게 됩니다.

# urls.py  TemplateView 사용 시

from django.urls import path
from django.views.generic import TemplateView

urlpatterns = [
    path("about/", TemplateView.as_view(template_name="about.html")),
]
# urls.py  View 사용 시

from django.urls import path
from myapp.views import MyView

urlpatterns=[

    path('about/', MyView.as_view()),

]

views.py

# views.py  TemplateView 사용 시

from django.views.generic import TemplateView


class AboutView(TemplateView):
    template_name = "about.html"
#views.py  View 사용 시

from django.http import HttpResponse
from django.views.generic import View

class MyView(View):
    def get(self, request):
    
        #view logic
        
        return HttpResponse('result')

클래스형 뷰 장점

위에서 간단하게 클래스형 뷰를 사용하는 방법을 알아보았습니다. 이런 클래스형 뷰 장점에 대해 설명하겠습니다.

Method 구분

클래스형 뷰를 사용하지 않는 경우

from django.http import HttpResponse


def my_view(request):
    if request.method == "GET":
        # <view logic>
        return HttpResponse("result")

클래스형 뷰를 사용하는 경우

from django.http import HttpResponse
from django.views import View


class MyView(View):
    def get(self, request):
        # <view logic>
        return HttpResponse("result")

위와 같이 get, post 등의 method를 구분하기 위해 기존에는 if문을 사용해야 했지만, 클래스형 뷰를 사용하면 함수명에 get, post를 넣어서 더욱 쉽게 관리할 수 있습니다.

상속

from django.http import HttpResponse
from django.views import View


class GreetingView(View):
    greeting = "Good Day"

    def get(self, request):
        return HttpResponse(self.greeting)

위 클래스형 뷰를 상속받을 수 있습니다.

class MorningGreetingView(GreetingView):
    greeting = "Morning to ya"

혹은 다음과 같은 방식을 사용해 상속을 구현할 수도 있습니다.

urlpatterns = [
    path("about/", GreetingView.as_view(greeting="G'day")),
]

results matching ""

    No results matching ""