[Django] Generic view
Generic View 정리하기
Django에서 제공하는 제네릭 뷰는 역할에 따라 크게 네 가지로 나누어져 있습니다. 각각 로직에 맞는 기능을 편하게 구현할 수 있게 하는 클래스 변수와 메소드를 이용해서 정해진 틀에 따라 구현을 해야합니다.
종류 | 뷰 | 설명 |
---|---|---|
Base Views | TemplateView RedirectView | 템플릿을 랜더해서 결과로 돌려주거나 다른 URL로 리디렉션 하는등의 기본적인 기능을 하는 뷰 |
Display Views | ListView DetailView | 데이터를 보여주는 기능을 하는 뷰 |
Edit Views | FormView CreateView UpdateView DeleteView | 데이터 생성, 수정, 삭제등의 기능을 하는 뷰 |
Date Views | YearArchiveView MonthArchiveView DayArchiveView TodayArchiveView | 날짜를 중심으로 데이터를 조회하는 기능을 하는 뷰 Date Views 문서보기 |
제가 사용한 제네릭 뷰의 각 속성들을 정리해놓은 것 입니다.
Base Views
RedirectView
RedirectView는 들어온 요청을 새로운 URL로 이동시키는 기능을 합니다.
속성 | 설명 | 기본값 |
---|---|---|
url | 이동할 URL을 지정하는 속성 | None |
pattern_name | URL 패턴의 이름을 지정하는 속성 | None |
query_string | 쿼리 스트링을 전달할 지 여부 | False |
TemplateView
TemplateView는 주어진 템플릿을 렌더링해서 보여주는 기능을 합니다.
속성 | 설명 | 기본값 |
---|---|---|
template_name | 렌더할 템플릿을 지정하는 속성 | None |
Display Views
DetailView
DetailView는 하나의 데이터를 보여주는 기능을 합니다. ‘상세 보기’를 생각하면 됩니다.
속성 | 설명 | 기본값 |
---|---|---|
model | 사용할 모델 지정 | None |
pk_url_kwarg | 보여주기 위한 단일 데이터를 조회할 때 사용할 키워드 인수 지정 (urls.py에서 지정한 키워드 인수) | ‘pk’ |
template_name | 렌더할 템플릿을 지정하는 속성 | None |
context_object_name | 템플릿으로 전달할 모델의 context 키워드 지정 | ‘ |
ListView
ListView는 여러 데이터를 보여주는 기능을 합니다. ‘목록 보기’를 생각하면 됩니다.
속성 | 설명 | 기본값 |
---|---|---|
model | 사용할 모델 지정 | None |
ordering | 데이터 정렬 속성 지정(order_by와 동일한 값 사용) | None |
paginate_by | 페이지에 표시 할 데이터의 수 | None |
page_kwarg | 쿼리스트링으로부터 가져올 현재 페이지에 대한 키워드 | ‘page’ |
template_name | 렌더할 템플릿을 지정하는 속성 | None |
context_object_name | 템플릿으로 전달할 모델의 context 키워드 지정 | ‘ |
Editing Views
FormView
FormView는 Form을 렌더링해서 보여주는 기능을 하는 뷰입니다.
속성 | 설명 | 기본값 |
---|---|---|
form_class | 입력을 위한 Form Class를 지정합니다. | None |
success_url | 처리가 성공했을 때 리디렉션 할 URL을 지정 | None |
template_name | 렌더할 템플릿을 지정하는 속성 | None |
CreateView
Createview는 새로운 데이터를 생성을 위한 뷰입니다.
속성 | 설명 | 기본값 |
---|---|---|
model | 사용할 모델 지정 | None |
form_class | 입력을 위한 Form Class를 지정합니다. | None |
fields | 데이터 입력에 사용할 필드를 명시적으로 지정합니다. | None |
template_name | 렌더할 템플릿을 지정하는 속성 | None |
pk_url_kwarg | 보여주기 위한 단일 데이터를 조회할 때 사용할 키워드 인수 지정 urls.py에서 지정한 키워드 인수) | ‘pk’ |
success_url | 처리가 성공했을 때 리디렉션 할 URL을 지정 | None |
UpdateView
UpdateView는 기존 데이터 개체의 수정을 위한 뷰입니다.
속성 | 설명 | 기본값 |
---|---|---|
model | 사용할 모델 지정 | None |
form_class | 입력을 위한 Form Class를 지정합니다. | None |
field | 데이터 입력에 사용할 필드를 명시적으로 지정합니다. | None |
template_name | 렌더할 템플릿을 지정하는 속성 | None |
pk_url_kwarg | 보여주기 위한 단일 데이터를 조회할 때 사용할 키워드 인수 지정 (urls.py에서 지정한 키워드 인수) | ‘pk’ |
success_url | 처리가 성공했을 때 리디렉션 할 URL을 지정 | None |
context_object_name | 템플릿으로 전달할 모델의 context 키워드 지정 |
DeleteView
DeleteView는 기존 데이터를 삭제하는 기능을 위한 뷰입니다.
속성 | 설명 | 기본값 |
---|---|---|
model | 사용할 모델 지정 | None |
template_name | 렌더할 템플릿을 지정하는 속성 | None |
pk_url_kwarg | 보여주기 위한 단일 데이터를 조회할 때 사용할 키워드 인수 지정 (urls.py에서 지정한 키워드 인수) | ‘pk’ |
success_url | 처리가 성공했을 때 리디렉션 할 URL을 지정 | None |
context_object_name | 템플릿으로 전달할 모델의 context 키워드 지정 |
Context 정리하기
Context는 View에서 Template으로 전달되어 렌더링시 사용할 수 있는 사전형 데이터 변수입니다. 앞에서 함수형 뷰를 사용할 때 render 함수의 세 번째 파라미터로 넘겨서 사용했었죠.
def function_view(request):
return render(request, template_name, context)
Django의 Generic 뷰는 이러한 Context를 각각의 기능에 맞게 자동으로 Template에 전달합니다.
모델(Model) 데이터
기본적으로 모델(Model) 데이터는 Template에 context로 전달됩니다. 하나의 데이터를 다루는 View는 하나의 데이터를 ‘object’라는 키워드로 전달하고 여러개의 데이터를 다루는 View는 ‘object_list’라는 키워드로 전달합니다. 그리고 같은 데이터를 ‘model’ 클래스 변수에 명시한 Model을 보고 소문자로 변형해 함께 전달합니다. 아래 예시를 보면서 이해해봅시다.
from django.views.generic import DetailView
from .models import Post
class PostDetailView(DetailView):
model = Post
...
DetailView는 하나의 데이터를 다루는 로직을 수행합니다. 그래서 위처럼 model 클래스 변수를 지정하면 자동으로 ‘object’라는 키워드로 데이터베이스에서 조회한 하나의 Post 데이터를 Template에 전달합니다.
그러면 Template에서는 템플릿 변수를 사용해서 같은 형태로 접근할 수 있는거죠. 그리고 이 object와 똑같은 데이터를 모델명을 소문자로 쓴 형태인 post
로도 Template에 함께 전달합니다. 그러니까 같은 데이터가 object
와 post
두 개의 키워드로 전달되는거죠. 이렇게 되면 Template에서 조금 더 직관적인 같은 형태로 사용할 수 있습니다.
from django.views.generic import ListView
from .models import Post
class PostListView(ListView):
model = Post
...
자, 이번에는 ListView를 예로 들어볼게요. ListView는 여러 데이터를 다루는 로직을 수행하죠? 그래서 model 클래스 변수를 지정하면 자동으로 데이터베이스에서 조회한 Post 데이터 목록을 object_list
라는 키워드로 Template에 전달합니다. 그리고 이때 똑같은 데이터를 model 키워드 변수에 명시된 모델을 참고하여 소문자로 쓴 형태인 <model_name>_list
즉 post_list
키워드로도 context를 전달합니다. 그러니까 Template에서는 object_list
와 post_list
두 개의 키워드로 Post 데이터 목록에 접근할 수 있는겁니다.
context_obejct_name
자, 그러면 context_object_name 클래스 변수는 무엇을 지정해주는 걸까요? 위에서 설명한 context 중 바로 모델명을 보고 유추하는 <model_name>
또는 <model_name>_list
같은 이름들을 바꿔주는 것 입니다. Django가 알아서 모델명을 보고 유추해서 넘겨주는 context 이름을 커스터마이징 할 수 있는거죠. 이것도 예시를 보면서 이해해봅시다.
from django.views.generic import ListView
from .models import Post
class PostListView(ListView):
model = Post
...
이렇게 적으면 Post 데이터 목록이 object_list
와 post_list
라는 두 개의 키워드로 전달되겠죠? 그런데 이때 context_object_name을 아래와 같이 명시해주면
from django.views.generic import ListView
from .models import Post
class PostListView(ListView):
model = Post
context_object_name = 'posts'
...
post_list
가 posts
로 변경되어 전달됩니다. 그러니까 Post 데이터목록이 object_list
와 posts
두 개의 키워드로 전달되게 되는거죠. 이렇게 generic 뷰가 자동으로 모델을 보고 생성하는 context 키워드를 변경해 주는 것이 바로 context_object_name 입니다.
그 외 Context 목록
위에서 설명한 context 말고도 이전에 사용해보았던 context도 있습니다. 당연히 이러한 context를 모두 외울 필요는 없고 ‘아, 그런것도 있었는데?’ 정도의 경험을 갖는 것이 중요합니다. 실제 어떻게 구현해야하는지 형태가 무엇인지는 필요할 때 Django 공식 문서를 보고 찾아서 구현하면 됩니다.
CreateView
키워드 | 설명 |
---|---|
form | form_class 클래스 변수에 명시한 폼이 전달됩니다. |
ListView
키워드 | 설명 |
---|---|
paginator | Paginator 객체가 전달됩니다. |
page_obj | 현재 Page 객체가 전달됩니다. |
is_paginated | 페이지네이션 적용 여부가 boolean 형으로 전달됩니다. |
UpdateView
키워드 | 설명 |
---|---|
form | form_class 클래스 변수에 명시한 폼이 전달됩니다. |
댓글남기기