django view part 1

20
장장장장 장장 장장장 장장장 (Django View 장장 1) 장 장 장

Upload: joong-hyeon-kim

Post on 16-Apr-2017

283 views

Category:

Software


1 download

TRANSCRIPT

Page 1: Django View Part 1

장고걸스 서울 블루북 스터디

(Django View 심화 1)

김 중 현

Page 2: Django View Part 1

출처

해당 슬라이드는 한빛미디어에서 출간한

“ 파이썬 웹 프로그래밍 ( 실전편 ) : Django( 장고 ) 를 활용한 쉽고 빠른 웹 개발”의 내용을

참고하여 만들었음을 먼저 알립니다 .

http://www.hanbit.co.kr/store/books/look.php?p_code=B7703021280

Page 3: Django View Part 1

장고 핵심 기능 - View

장고 (Django) 에서는 View 를 함수로 작성할 수 있고 , 클래스로도 작성할 수 있다 .

간단한 로직인 경우는 함수형 뷰로 신속하게 개발할 수 있고 , 프로젝트가 크고 로직이 복잡하면 클래스형 뷰로 개발하는 것이 좋다 .

장고는 잘 준비된 클래스형 제네릭 뷰를 제공하고 있다 .

클래스형 뷰를 작성하기 전 , 우리가 개발하고자 하는 목적에 가장 알맞은 제네릭 뷰를 선택하여 상속 받고 필요한 속성과 메소드를 오버라이딩한다 .

Page 4: Django View Part 1

제네릭 뷰 (Generic View)?

장고는 웹 프로그램 개발 시 공통적으로 사용하는 로직을 미리 개발해놓고 기본 클래스로 제공하고 있는데 , 이것이 바로 ‘제네릭 뷰’이다 .

개발자는 이러한 제네릭 뷰를 상속받아서 필요한 속성과 메소드를 오버라이딩하여 사용할 수 있다 .

Page 5: Django View Part 1

제네릭 뷰의 종류들 - 1제네릭 뷰 분류 제네릭 뷰 이름 뷰의 기능 또는 역할

Base View View 가장 기본이 되는 최상위 제네릭 뷰 . 다른 모든 제네릭 뷰들은 View 의 하위 클래스 .

TemplateView 템플릿이 주어지면 해당 템플릿을 렌더링 .

RedirectView URL 이 주어지면 해당 URL 로 리다이렉트 .

Generic Display View DetailView 객체 하나에 대한 상세 정보를 보여줌 .

ListView 조건에 맞는 여러 객체를 보여줌 .

Page 6: Django View Part 1

제네릭 뷰 간략 설명 - Base View, Generic Display View

View : 모든 클래스형 뷰의 기본이 되는 최상위 뷰 . 원하는 로직에 맞는 제네릭 뷰가 없는 경우 이 뷰를 상속받아서 새로운 클래스형 뷰를 작성할 수도 있음 .

TemplateView : 화면에 보여줄 템플릿 파일을 처리하는 정도의 간단한 뷰 .

RedirectView : 주어진 URL 로 리다이렉트시켜주는 제네릭 뷰 . 만일 URL 을 알 수 없다면 , 410 에러 응답 발생 . 복잡한 로직 없이 리다이렉트만을 원할 때 사용 .

DetailView : ListView 와 함께 가장 많이 사용됨 . 특정 객체 하나에 대한 상세 정보를 보여준다 . URLconf 의 URL 정의를 이용하여 특정 테이블의 특정 컬럼 값을 기준으로 레코드를 찾을 수 있음 . 즉 , 테이블은 뷰 클래스에서 지정하고 레코드 검색용 키는 URLconf 에서 지정 . 레코드 검색용 키는 보통 기본키 (PK) 사용 .

ListView : 자주 사용하는 제네릭 뷰 . 여러 객체의 리스트를 보여줌 . 테이블의 모든 레코드를 리스팅해주는 등 ...

Page 7: Django View Part 1

제네릭 뷰의 종류들 - 2제네릭 뷰 분류 제네릭 뷰 이름 뷰의 기능 또는 역할

Generic Edit View FormView 폼이 주어지면 해당 폼을 보여줌 .

CreateView 객체를 생성하는 폼을 보여줌 .

UpdateView 기존 객체를 수정하는 폼을 보여줌 .

DeleteView 기존 객체를 삭제하는 폼을 보여줌 .

Page 8: Django View Part 1

제네릭 뷰 간략 설명 - Generic Edit View

FormView : 폼을 보여주기 위한 제네릭 뷰 . 폼을 지정해주는 form_class 와 폼을 렌더링하는 데에 필요한 template_name 속성이 주요 속성 . 추가적으로 폼 처리가 성공한 후에 리다이렉트 목적지 URL 을 지정하는 success_url 속성도 사용 가능함 . get() 메소드와 post() 메소드 구분해 처리 , form_valid() 메소드 오버라이딩을 통한 폼 입력 데이터 유효성 검사 , 처리 완료 후 페이지 이동 등의 복잡한 과정을 FormView 가 알아서 처리해줌 .

CreateView : 새로운 레코드를 생성해서 테이블에 저장해주는 뷰 . CreateView 는 FormView 의 기능을 포함 , 모델 정의로부터 폼을 자동으로 만들어주는 기능과 데이터베이스에 레코드를 저장하는 기능이 더 추가됨 . 작업 대상 테이블을 model 속성으로 지정 , 폼을 만들 때 사용할 필드를 fields 속성으로 정의 , 처리 성공 후 이동할 URL 을 success_url 속성으로 지정 .

UpdateView : 테이블에 이미 있는 레코드를 수정해주는 제네릭 뷰 . 작업 대상 테이블로부터 폼을 만들어주며 , 최종적으로는 수정된 레코드를 테이블에 저장 . DetailView 와 동일하게 수정할 레코드를 URLconf 에서 지정 .

DeleteView : 기존 객체를 삭제하기 위한 제네릭 뷰 . 삭제 처리는 내부에서 이뤄지고 코드에 나타나는 것은 삭제 확인 화면 . DeleteView 는 삭제 확인용 폼만 필요하므로 입력 항목이 불필요하고 모델 정의를 참조하지도 않음 . 삭제할 레코드를 URLconf 에서 지정 .

Page 9: Django View Part 1

제네릭 뷰의 종류들 - 3제네릭 뷰 분류 제네릭 뷰 이름 뷰의 기능 또는 역할

Generic Date View

YearArchiveView 년도가 주어지면 그 년도에 해당하는 객체들을 보여줌 .

MonthArchiveView 연 , 월이 주어지면 그에 해당하는 객체들을 보여줌 .

WeekArchiveView 연도와 주차가 주어지면 그에 해당하는 객체들을 보여줌 .

DayArchiveView 연 , 월 , 일이 주어지면 그 날짜에 해당하는 객체들을 보여줌 .

TodayArchiveView 오늘 날짜에 해당하는 객체들을 보여줌 .

DateDetailView 연 , 월 , 일 , 기본 키 ( 또는 슬러그 ) 가 주어지면 그에 해당하는 특정 객체 하나에 대한 상세 정보를 보여줌 .

Page 10: Django View Part 1

제네릭 뷰 간략 설명 - Generic Date View 1

ArchiveIndexView : 여러 객체를 대상으로 날짜를 기준으로 리스팅해주는 제네릭 뷰 . 날짜 기반 제네릭 뷰의 최상위 뷰 . 날짜 기준 내림차순으로 정렬 . 어느 필드를 기준으로 정렬할지를 결정하는 date_field 속성이 가장 중요 .

YearArchiveView : 연도가 주어지면 , 여러 객체를 대상으로 가능한 월을 알려주는 제네릭 뷰 . 기본 동작은 객체들을 출력해주는 것이 아니라 , 객체의 날짜 필드를 조사해 월을 추출한다는 점을 유의 . 만일 주어진 연도에 해당하는 객체들을 알고 싶으면 make_object_list 속성을 True 로 지정 . model 속성이나 date+field 속성은 ArchiveIndexView 와 동일 . 마찬가지로 인자를 URLconf 에서 추출 . 템플릿으로 넘겨주는 컨텍스트 변수 중에서 object_list 는 인자로 주어진 연도에 해당하는 객체들의 리스트 , date_list 는 그 객체들의 월을 담고 있음 . make_object_list 속성이 False 이면 object_list 는 None.

MonthArchiveView : 주어진 연 / 월에 해당하는 객체를 보여주는 제네릭 뷰 . 인자는 URLconf 에서 추출 . model 속성이나 date_field 속성은 ArchiveIndexView 와 동일 , make_object_list 속성은 없음 . 템플릿 컨텍스트 변수 중에서 object_list 는 인자로 주어진 연 / 월에 해당하는 객체들의 리스트를 담고 있고 , date_list 는 그 객체들의 일을 담고 있음 .

Page 11: Django View Part 1

제네릭 뷰 간략 설명 - Generic Date View 2

WeekArchiveView : 연도와 주 (week) 가 주어지면 그에 해당하는 객체를 보여주는 제네릭 뷰 . 인자는 URLconf. 주 인자는 1 년을 주차로 표현하므로 , 1 부터 53 까지의 값을 가짐 . model, date_field 속성을 가짐 . 템플릿 컨텍스트 변수 중에서 object_list 는 인자로 주어진 연 / 주에 해당하는 객체들의 리스트를 담고 있고 , date_list 는 그 객체들의 연도를 담고 있음 .

DayArchiveView : 연 / 월 / 일이 주어지면 그에 해당하는 객체를 보여주는 제네릭 뷰 . 인자는 URLconf 에서 지정 . model, date_field 속성을 가짐 . 템플릿 컨텍스트 변수 중에서 object_list 는 인자로 주어진 연 / 월 / 일에 해당하는 객체들의 리스트를 담고 있고 , date_list 는 그 객체들의 연도를 담고 있음 .

TodayArchiveView : 오늘 날짜에 해당하는 객체를 보여주는 제네릭 뷰 . 인자가 불필요함 . 해당하는 URLconf 로 들어오면 , 뷰 내부에서 datetime.date.today() 함수로 오늘 날짜를 알아내서 처리 . 템플릿 컨텍스트 변수 중에서 object_list 는 오늘 날짜에 해당하는 객체들의 리스트를 담고 있고 , date_list 는 그 객체들의 연도를 담고 있음 .

DateDetailView : 날짜 기준으로 특정 객체를 찾아서 , 그 객체의 상세 정보를 보여주는 제네릭 뷰 . 객체를 찾는데 사용하는 인자로 기본키 또는 slug 인자와 함께 연 / 월 / 일 정보를 받음 . URLconf 에서 인자 지정 . 다른 날짜 기반의 제네릭 뷰들은 복수의 객체를 출력하나 DateDetailView 는 특정 객체 하나만을 다룸 . 따라서 템플릿 컨텍스트 변수는 object 가 있으며 , obejct_list 및 date_list 는 사용하지 않음 .

Page 12: Django View Part 1

중요 !

제네릭 뷰의 작업 대상이 반드시 테이블이어야 하는 것은 아니다 .

테이블의 레코드가 아니라도 , 일반 객체들이 들어 있는 QuerySet 객체이면 제네릭 뷰의 작업 대상이 될 수 있다 .

따라서 대부분의 제네릭 뷰들은 작업 대상을 지정하기 위한 속성으로 model, queryset 또는 get_queryset() 메소드를 제공한다 .

Page 13: Django View Part 1

제네릭 뷰 오버라이딩

분류 대상 설명

속성 오버라이딩

model 기본 뷰 3 개를 제외하고는 모든 제네릭 뷰에서 사용하는 속성 . 뷰가 출력할 데이터가 들어 있는 모델 지정 .

queryset 기본 뷰 3 개를 제외하고는 모든 제네릭 뷰에서 사용하는 속성 . 출력 대상이 되는 QuerySet 객체를 지정 . 이 속성을 지정하면 model 속성은 무시됨 .

template_name 모든 제네릭 뷰에서 사용 . 템플릿 파일명을 문자열로 지정 .

context_object_name 기본 뷰를 제외하고는 모든 제네릭 뷰에서 사용 . 템플릿 파일에서 사용할 컨텍스트 변수명을 지정 .

paginate_by ListView 와 날짜 기반 뷰에서 사용 . 페이징 기능이 활성화된 경우 , 페이지당 몇 개 항목을 출력할 것인지 정수로 지정 .

success_url FormView, CreateView, UpdateView, DeleteView 에서 사용 . 폼에 대한 처리 성공 후 리다이렉트될 URL 지정 .

Page 14: Django View Part 1

제네릭 뷰 오버라이딩

분류 대상 설명

속성 오버라이딩

date_field 날짜 기반 뷰에서 기준이 되는 필드 지정 . 이 필드를 기준으로 연 / 월 / 일을 검사 . 이 필드의 타입은 DateField 혹은 DateTimeField 이어야 함 .

make_object_list YearArchiveVeiw 사용 시 해당 년에 맞는 객체들의 리스트 생성 여부를 지정 . True 이면 객체들의 리스트를 만들고 템플릿에서 사용할 수 있고 , False 이면 queryset 속성에 None 이 할당 .

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

initial FormView, CreateView, UpdateView 에서 사용 . 폼에 사용할 초기 데이터를 딕셔너리로 지정 .

fields CreateView, UpdateView 에서 사용 . 폼에 사용할 필드를 지정 . ModelForm 클래스의 Meta.fields 속성과 동일한 의미 .

Page 15: Django View Part 1

제네릭 뷰 오버라이딩

분류 대상 설명

메소드 오버라이딩

get_queryset() 기본 뷰를 제외하고 모든 제네릭 뷰에서 사용 . 출력 객체를 검색하기 위한 대상 QuerySet 객체 또는 출력 대상인 객체 리스트를 반환 . 기본으로는 queryset 속성값을 반환 . queryset 속성이 지정되지 않은 경우 모델 매니저 클래스의 all() 메소드를 호출해 QuerySet 객체를 생성하여 이를 반환 .

get_context_data(**kwarg) 모든 제네릭 뷰에서 사용 . 템플릿에서 사용할 컨텍스트 데이터를 반환 .

form_valid(form) FormView, CreateView, UpdateView 에서 사용 . get_success_url 메소드가 반환하는 URL 로 리다이렉트를 수행 .

Page 16: Django View Part 1

Method Flowchart?

제네릭 뷰의 처리 흐름을 나타내는 용어 .

다음은 대표적인 제네릭 뷰 중 DetailView 와 ListView 의 메소드 플로우차트 .

Page 17: Django View Part 1

Method Flowchart - ListView 1

dispatch : 클라이언트 요청 HTTP 메소드 (GET, POST 등 ) 검사 , 뷰 클래스에 정의된 적절한 처리 메소드 호출 .

http_method_not_allowed : dispatch 메소드에 의해 호출되는 메인 처리 메소드를 찾지 못하는 경우 , 이 메소드를 호출 .

get_template_names : 템플릿 파일명을 담은 리스트를 반환 .

get_queryset : 뷰에서 출력할 항목들의 리스트 반환 .

Page 18: Django View Part 1

Method Flowchart - ListView 2

get_context_object_name : 출력 대상이 되는 리스트에 대한 컨텍스트 변수명 리턴 .

get_context_data : 템플릿에서 사용할 컨텍스트 데이터 리턴 .

get 또는 post 등 ...: 메인 처리 메소드 .

render_to_response : self.response_class 객체 리턴 .

Page 19: Django View Part 1

Method Flowchart - DetailView 1

dispatch : 클라이언트 요청 HTTP 메소드 검사 . 뷰 클래스에 정의된 적절한 처리 메소드 호출 .

http_method_not_allowed : dispatch 메소드에 의해 호출되는 메인 처리 메소드를 찾지 못한 경우 , 이 메소드를 호출 .

get_template_names : 템플릿 파일명을 담은 리스트 반환 .

get_slug_field : slug 필드명을 반환 . 기본은 slug_field 속성값을 반환 .

Page 20: Django View Part 1

Method Flowchart - DetailView 2

get_queryset : 출력 객체 검색을 위한 대상 QuerySet 객체 반환 .

get_object : 뷰가 출력한 객체 한 개를 리턴 .

get_context_object_name : 컨텍스트 변수명을 리턴 .

get_context_data : 템플릿에서 사용할 컨텍스트 데이터 리턴 .

get 또는 post 등… : 메인 처리 메소드 .

render_to_response : self.response_class 객체 리턴 .