Django 핵심기능 View

김용녀·2022년 7월 29일
0

View 정의

뷰는 웹 요청을 받아서 분석하고 DB처리 등에 대한 로직을 수행하며 템플릿을 통해 화면에 표시할 데이터를 만들어서 데이터를 클라이언트에게 응답하는 역할을 한다.

제네릭 뷰

제네릭 뷰란? 클래스형 뷰를 작성하기 위해 장고 내부에서 상속받아 사용하는 뷰다 대표적인 종류에는 다음과 같이 있다.

  • View -최상위 클래스형 뷰 ,보통땐x, 우리가 뷰를 만들때나 사용한다.
  • TemplateView - 간단하게 화면 보여줄 목적으로 사용한다. template_name 이용
  • RedirectView - 주어진 URL로 redirect시켜준다.
  • DetailView - 특정 객체 하나에 대한 정보를 보여준다. 주로 테이블에서 특정 레코드를 컨텍스트 변수로 템플릿에 넘겨준다. 테이블만 지정하는데, 레코드는 어떻게 정하냐??!
    -> 정답은 URLConf에서 slug를 같이 넘겨 DetailView에서 찾아낼수있다.
  • ListView - 여러 객체의 리스트를 보여준다.object_list컨텍스트 변수에 담아 템플릿에 넘겨준다.
  • FormView - 폼을 보여주기 위한 제네릭 뷰다. 그래서 폼을 지정해주는 form_class와 렌더링할때 template_name, 폼처리 후 리다이렉트 URL까지(success_url) 필요하다. 폼의 경우 GET,POST가 다르게 반응해야하는데 FormView가 알아서처리 하고 알아서 적절한 페이지로 이동시킨다.
    개발자는 필요한 속성이나 메소드만 오버라이딩 하면된다.
  • CreateView- 새로운 레코드를 생성해서 테이블에 저장해주는 뷰다.새로운 레코드를 저장하려면 폼이 필요하기 때문에 CreateView는 FormView를 포함하고있다.
  • UpdateView- 테이블에 이미 있는 레코드를 수정하는 뷰다.CreateView와 매우 유사하고, 마찬가지로 폼을 토대로 레코드를 수정한다. 유의할점은 DetailView처럼 특정 레코드 위치는 URLconf에서 지정한다.
  • DeleteView- 해당 뷰는 삭제 확인용 폼만 필요하고 입력 항목이 따로 필요없다.이것 또한 레코드 지정은 URLconf에서 지정한다.


날짜관련 뷰들은 컨텍스트 변수를 넘길때 인자에 따른 해당 객체값+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로 리다이렉트를 수행한다.

제네릭 뷰 흐름

  1. ListView

    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() 템플릿 파일명 담은 리스트 반환

  2. DetailView

    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() 템플릿 파일명 담은 리스트 반환

MRO

  • 장고에서 각 클래스에 석힌 메서드 이름이 겹칠때, 우선순위를 정해주고자 파이썬 자체에서 제공하는 기능.
  • 대부분 겹치지 않지만 개발자가 직접 만드는 경우를 위해 이해하고 넘어가자

제네릭뷰의 페이징 처리

화면에 보여줄 데이터가 많을때 여러 페이지로 나눠 보여주는기능이다.
아까 배운 paginate_by 속성으로 한 페이지당 객체 개수를 할당한다. url경로에서 페이지 번호를 지정하는 방법으로 이용한다.
페이지 정보+데이터 들을 컨텍스트변수에 담아 템플릿에 넘길때 컨텍스트 변수에는 다음과같은 정보들이 들어있다.

object_list : 객체 정보
is_paginated : 출력 결과가 페이징 처리 될것인지 boolean변수
paginator
page_obj

paginator 클래스

페이징 기능의 메인 클래스다. 주요 역할은 객체의 리스트와 페이지당 항목 수를 필수 인자로 받아 페이지 객체를 생성한다.

page 클래스

  • paginator객체에 의해 생성된 단위 페이지를 나타내는 객체.
  • paginator.page()를 이용해 호출된다.

단축함수

  • render_to_response()
    템플릿파일과 컨텍스트 사전을 인자로 받아 렌더링 후, HttpResponse객체를 반환하는 함수다.
  • render()
    위 render_to_response()와 같다. 한가지 차이점은 render()은 request를 필수 인자로 갖고있어야 한다.
  • redirect()
    주어진 인자에 알맞은 URL로 HttpResponseRedirect을 리턴한다.
    인자로 절대경ㄹ가 주어질수도, 상대경로가 주어질수도있다.
profile
어서오세요

0개의 댓글