뷰는 웹 요청을 받아서 분석하고 DB처리 등에 대한 로직을 수행하며 템플릿을 통해 화면에 표시할 데이터를 만들어서 데이터를 클라이언트에게 응답하는 역할을 한다.
제네릭 뷰란? 클래스형 뷰를 작성하기 위해 장고 내부에서 상속받아 사용하는 뷰다 대표적인 종류에는 다음과 같이 있다.
날짜관련 뷰들은 컨텍스트 변수를 넘길때 인자에 따른 해당 객체값+date_list를 각각 가지고있다.
ArchiveIndexView- 여러 객체를 대상으로 날짜 기준으로 리스팅 해준다. 날짜 기반 최상위뷰, date_field에 입력되는 값을 기준으로 정렬된다. 템플 릿에 넘길땐 객체 리스트+ 연도 리스트 또한 담고있다.
YearArchiveView- 연도가 주어지면, 여러 객체를 대상으로 가능한 월을 알려준다(월을 추출한다!) 단, make_object_list = True할경우 월 말고 객체 자체를 리턴한다. URLconf를 통해 인자가 넘어온다.
MonthArchiveView- 주어진 연/월에 따른 객체를 보여준다. 인자값은 URLconf를 통해 넘어온다
WeekArchiveView- 연도와 주(week)에 따른 객체를 보여준다.URLconf를 통해 인자가 넘어오며 속성 지정은 이전과 같다.
DayArchiveView- 연,월,일 인자 3개를 받는다.
TodatArchiveView- 오늘날짜를 반환하기때문에 따로 날짜인자가 필요없다.대신 path('archive/today/')가 들어온다. 이 URL이 들어오면 알아서 datetime.date.today()함수가 오늘날짜를 구해온다
DateDetailView- 날짜 기준으로 특정 객체를 찾아 해당 객체의 상세정보를 보여주는 뷰다. ArchiveIndexView와 차이는 여기서는 기본키(또는 slug)인자도 이용한다. +연/월/일 을 받아 Url에서 4개의 인자가 필요하다.다른 뷰와 차이점은 다른 뷰들은 복수의 객체를 출력하는게 목적인데 해당 뷰는 특정 객체 하나만 다룬다. 그래서 템플릿에 넘기는 컨텍스트 변수가 object_list가 아닌 object다.
각 제네릭뷰 마다 제공하는 속성과 메소드가 다르다 . 한번 알아보자
model: 기본뷰(view,Template,Redirect) 3개와 FormView를 제외하고 모든 제네릭 뷰에서 사용하는 속성이다. 작업 대상 데이터가 들어있는 모델을 지정한다. model대신 queryset지정도 가능하다
model = Bookmark
queryset = Bookmark.objects.all() (다음 두개는 같은 의미다)
(쿼리셋 쓰면 모델이무시됨)
querysey: 위 설명을 참고하자
template_name : TemplateView를 포함해 모든 제네릭뷰에서 이용. 템플릿 파일명을 지정.
context_object_name : 기본뷰 3개 제외 모두이용. 템플릿 파일에서 이용할 컨텍스트변수명 지정
paginate_by : 페이징 기능이 활성화된 경우, 페이지 당 항목 개수 지정
date_field : 날짜기반 뷰에서 기준 필드를 지정.
make_object_list : YearArchiveView에서 년에 맞는 객체 리스트 생성할지 여부 정함.
form_class : FormView,CreateView,UpdateView에서 폼만들때 이용
initial : FormView,CreateView,UpdateView에서 폼 데이터 초기화시 사전으로 지정
field : CreateView,UpdateView에서 폼에 사용할 필드 지정.
success_url : FormView,CreateView,UpdateView,DeleteVIew에서 폼에 대한 처리 후 리다이렉트 URL
get_queryset() : 기본 뷰 3개 제외 모든 뷰 이용. 출력 대상인 객체를 URL에서 인자값을 받아 토대로 출력대상 정함. (기존 쿼리셋이나 주석처리)
model,queryset,get_queryset() 세개 모두 유사함
get_context_data(**kwargs): 템플릿에서 이용할 컨텍스트 변수를 추가하거나 변경.
디폴트로 ListView에선 object_list가 DetailView에선 object인데,추가 지정하고싶다면 이 메소드를 이용하면 된다.
form_valid(form) : FormView,CreateView,UpdateView에서 이용한다. get_success_url메소드가 반환하는 URL로 리다이렉트를 수행한다.
setup()- 공통으로 사용할 속성들 정의
dispatch()- 클라이언트의 HTTP요청을 분석해 GET,POST중 호출
X- http_method_not_allowd() dispatch가 요청 분석 실패
get()- 메인 처리 메소드
get_queryset()- 객체 리스트 반환
get_context_data()- 템플릿에서 사용할 컨텍스트 변수 를 반환
get_context_object_name() 컨템스트 변수 명반환
render_to_response()- 최종 응답인 self.response_class객체 반환
get_template_names() 템플릿 파일명 담은 리스트 반환
setup()- 공통으로 사용할 속성들 정의
dispatch()- 클라이언트의 HTTP요청을 분석해 GET,POST중 호출
X- http_method_not_allowd() dispatch가 요청 분석 실패
get()- 메인 처리 메소드
get_object() - 작업대상 객체 하나를 반환한다.get_queryset으로 리스트를 얻고, pk또는 slug를 통해 검색 수행
get_context_data()- 템플릿에서 사용할 컨텍스트 변수 를 반환
get_context_object_name() 컨템스트 변수 명반환
render_to_response()- 최종 응답인 self.response_class객체 반환
get_template_names() 템플릿 파일명 담은 리스트 반환
화면에 보여줄 데이터가 많을때 여러 페이지로 나눠 보여주는기능이다.
아까 배운 paginate_by 속성으로 한 페이지당 객체 개수를 할당한다. url경로에서 페이지 번호를 지정하는 방법으로 이용한다.
페이지 정보+데이터 들을 컨텍스트변수에 담아 템플릿에 넘길때 컨텍스트 변수에는 다음과같은 정보들이 들어있다.
object_list : 객체 정보
is_paginated : 출력 결과가 페이징 처리 될것인지 boolean변수
paginator
page_obj
페이징 기능의 메인 클래스다. 주요 역할은 객체의 리스트와 페이지당 항목 수를 필수 인자로 받아 페이지 객체를 생성한다.
- render_to_response()
템플릿파일과 컨텍스트 사전을 인자로 받아 렌더링 후, HttpResponse객체를 반환하는 함수다.- render()
위 render_to_response()와 같다. 한가지 차이점은 render()은 request를 필수 인자로 갖고있어야 한다.- redirect()
주어진 인자에 알맞은 URL로 HttpResponseRedirect을 리턴한다.
인자로 절대경ㄹ가 주어질수도, 상대경로가 주어질수도있다.