[Django]FBV 와 CBV

김예진·2021년 2월 7일
4

Django

목록 보기
10/10

1. Django에서 views.py 처리

Django는 Views.py를 가지고 있고, urls.py에서 요청에 따라 views.py로 보내서 다시 처리한다. 이때, Views 를 처리하는 방법은 2가지가 있는데, 함수(FBV)로 처리하는 방법과 클래스(CBV)로 처리하는 방법이다.

2. FBV

함수 기반 뷰(Function-Base Views)를 뜻하며,

함수를 사용하는 뷰는 너무나 심플하고 가속성이 좋다.

아래 처럼 심플하게 사용할 수 있다.

urls.py

urlpatterns = [
    path('', views.index, name='index'),
]

views.py

def index(request):
    if request.method == 'POST':         
        # POST 요청일경우 
    else:         
        # POST 요청이 아닐 경우

그러나 코드를 확장하거나 재사용하기 어려움, 조건문으로 HTTP 메소드 구분해야하는 단점이 있다.

3. CBV

클래스 기반 뷰(Class-Based Views)를 뜻하며, 클래스형 뷰는 상속과 믹스인 기능을 이용하여 코드 재사용하고 뷰를 체계적으로 구성할 수 있다.

CBV의 장점

GET, POST 등 HTTP 메소드에 따른 처리 코드를 작성할 때 if 함수 대신에 메소드 명으로 코드의 구조가 깔끔하다.
다중상속 같은 객체지향 기법을 활용해 제너릭 뷰, 믹스인 클래스 등을 사용해 코드의 재사용과 개발 생산성을 높여준다.

CBV 사용 가이드라인

뷰는 간단 명료해야 한다.
뷰 코드의 양은 적으면 적을수록 좋다.
뷰 안에서 같은 코드를 반복적으로 사용하지 않는다.
뷰는 프레젠테이션 로직에서 관리하고 비즈니스 로직은 모델에서 처리한다. 매우 특별한 경우에만 폼에서 처리한다.
403, 404, 500 에러 핸들링에는 CBV를 이용하지 않고 FBV를 이용한다.
믹스인은 간단명료해야 한다.

제너릭 뷰와 상속

  • 제너릭 뷰의 4가지 분류

1) 기반 뷰(Base View): 뷰 클래스를 생성하고 다른, 제너릭 뷰의 부모 클래스가 되는 기본 제너릭 뷰
2) 제너릭 보기 뷰(Generic Display View): 객체의 목록 또는 하나의 객체 상세 정보를 보여주는 뷰
3) 제너릭 수정 뷰(Generic Edit View): 폼을 통해 객체를 생성, 수정, 삭제하는 기능을 제공하는 뷰
4) 제너릭 날짜 뷰(Generic Date View): 날짜 기반 객체의 연/월/일 페이지로 구분해 보여주는 뷰

- 주요 제너릭 뷰 목록

1) 기반 뷰(Base View)
View: 최상위 부모 제너릭 뷰 클래스
TemplateView: 주어진 템플릿으로 렌더링
RedirectView: 주어진 URL로 리다이렉트

2) 제너릭 보기 뷰(Generic Display View)
DetailView: 조건에 맞는 하나의 객체 출력
ListView: 조건에 맞는 객체 목록 출력
제너릭 수정 뷰(Generic Edit View)
FormView: 폼이 주어지면 해당 폼을 출력
CreateView: 객체를 생성하는 폼 출력
UpdateView: 기존 객체를 수정하는 폼을 출력
DeleteView: 기존 객체를 삭제하는 폼을 출력

3) 제너릭 날짜 뷰(Generic Date View)
YearArchiveView: 주어진 연도에 해당하는 객체 출력
MonthArchiveView: 주어진 월에 해당하는 객체 출력
DayArchiveView: 주어진 날짜에 해당하는 객체 출력
TodayArchiveView: 오늘 날짜에 해당하는 객체 출력
DateDetailView: 주어진 연, 월, 일 PK(또는 슬러그)에 해당하는 객체 출력

4) 제너릭 뷰 오버라이딩
: 속성 변수 오버라이딩

model

기본 뷰(View, Template, RedirectView) 3개를 제외하고 모든 제너릭 뷰에서 사용한다.

queryset

기본 뷰(View, Template, RedirectView) 3개를 제외하고 모든 제너릭 뷰에서 사용한다. queryset을 사용하면 model 속성은 무시된다.

template_name

TemplateView를 포함한 모든 제너릭 뷰에서 사용한다. 템플릿 파일명을 문자열로 지정한다.

context_object_name

뷰에서 템플릿 파일에 전달하는 컨텍스트 변수명을 지정한다.

paginate_by

ListView와 날짜 기반 뷰(예, YearArchiveView)에서 사용한다. 페이징 기능이 활성화 된 경우 페이지당 출력 항목 수를 정수로 지정한다.

date_field

날짜 기반 뷰(예, YearArchiveView)에서 사용한다. 이 필드의 타입은 DateField 또는 DateTimeField이다.

form_class

FormView, CreateView, UpdateView에서 폼을 만드는데 사용할 클래스를 지정한다.

success_url

FormView, CreateView, UpdateView, DeleteView에서 폼에 대한 처리가 성공한 후 리디이렉트할 URL 주소이다.

메소드 오버라이딩

def get_queryset()

기본 뷰(View, Template, RedirectView) 3개를 제외하고 모든 제너릭 뷰에서 사용한다. 디폴트는 queryset 속성을 반환한다. queryset 속성이 지정되지 않은 경우 모델 매니저 클래스의 all() 메소드를 호출해 QuerySet 객체를 생성해 반환한다.

def get_context_data(**kwargs)

뷰에서 템플릿 파일에 넘겨주는 컨텍스트 데이터를 추가하거나 변경하는 목적으로 오버라이딩한다.

def form_valid(form)

모델을 지정하는 방법 3가지

1) model 속성 변수 지정
2) queryset 속성 변수 지정
3) def get_queryset() 메소드 오버라이딩

profile
Backend Developer 🌱 벨로그 내용을 티스토리로 이사중~!

1개의 댓글

comment-user-thumbnail
2021년 6월 22일

잘읽었습니다. 감사합니다.

답글 달기