정리
- Function Base View (FBV - 함수 기반 뷰)
- 함수로 구현한 뷰
- Class Base View (CBV - 클래스 기반 뷰)
- 클래스로 함수를 구현한 뷰
# 함수 기반 뷰
def about(request):
return HttpResponse('안녕하세요. AskDjango입니다.')
# 클래스 기반 뷰
class AboutView(object):
@classmethod
def as_view(cls, message):
def view_fn(request):
return view_fn
# 클래스 기반 뷰를 통해 만들어낸 함수
about = AboutView.as_view('안녕하세요. AskDjango입니다')
클래스의 3가지 함수 형식
- instance method : instance를 통한 호출. 첫번째 인자로 instance가 자동 지정 (self에 대입)
- class method : class를 통한 호출. 첫번째 인자로 Class가 자동 지정 (cls에 대입)
- static method : class를 통한 호출. 자동으로 지정되는 인자가 없음. 활용은 class method와 동일.
class Person(object):
def __init__(self, name, country):
self.name = name
self.contry = country
def say_hello(self):
return '안녕. 나는 {}이야. {}에서 왔어'.format(self.name, self.country)
@staticmethod
def new_korean1(name):
return Person(name, 'Korea')
@classmethod
def new_korea2(cls, name):
return cls(name, 'Korea')
Function Base View
from django.shortcuts import get_object_or 404, render
# 특정 id의 post detail 뷰 함수
def post_detail(request, id):
post = get_object_or_404(Post, id=id)
return render(request, 'blog/post_detail.html', {
'post' : post,
})
# 특정 id의 article detail 뷰 함수
def article_detail(request, id):
post = get_object_or_404(Article, id=id)
return render(request, 'blog/article_detail.html', {
'article' : article,
})
위 처럼 FBV가 반복되어 사용되어질 경우 아래 처럼 CBV를 활용하는 방법이 효율적 일 수 있다.
Class Base View
clasee DetailView(object)
@classmethod
def as_view(cls, model):
def view_fn(request, id):
instance = get_object_or_404(model, id=id)
instance_name = model._meta.model_name
template_name = '{}/{}_detail.html'.format(model._meta.app_label, instance_name)
return render(request, template_name, {
instance_name : instance,
})
return view_fn
post_detail = DetailView.as_view(Post)
article_detail = DetailView.as_view(Article)
CBV는 재사용성에는 용이하지만 조금 복잡해 질 수 있다.