2. 장고 핵심 기능 - View
(0) 뷰(View)란
- 뷰는 웹 요청을 받아서 최종 응답 데이터를 웹 클라이언트로 반환하는 함수(정확히는 호출 가능한 객체, callable)
- 웹 요청을 분석, 데이터베이스 처리 등 필요 로직을 수행한 후 템플릿을 통해 화면에 표시할 데이터를 만들어 최종 데이터를 클라이언트에게 응답
- 장고에서는 뷰를 함수로 작성할 수 있고 클래스로도 작성이 가능
- 클래스형 뷰가 장점이 많음
- 상속과 믹스인 기능을 사용하여 코드를 재사용할 수 있음
- 뷰를 체계적으로 구성할 수 있어 읽기가 쉬워짐
- 장고에는 잘 준비된 클래스형 제네릭 뷰를 제공하고 있음
(1) 제네릭 뷰 선택
- 클래스형 뷰를 작성하기 위해선 클래스형 제네릭 뷰를 상속 받아 필요한 속성과 메서드를 오버라이딩하는 작업이 필요
- 제네릭 뷰 : 장고에서 제공하는, 웹 개발 시 공통적으로 사용하는 로직을 미리 개발해놓고 기본 클래스로 제공하는 것
- 제네릭 뷰 요약
- Base View
- View : 가장 기본이 되는 최상위 제네릭 뷰
- TemplateView : 템플릿이 주어지면 해당 템플릿을 렌더링해줌
- RedirectView : URL이 주어지면 해당 URL로 리다이렉트시켜줌
- Generic Display View
- ListView : 조건에 맞는 여러 개의 객체 리스트를 보여줌
- DetailView : 객체 하나에 대한 상세한 정보를 보여줌
- Generic Edit View
- FormView : 폼이 주어지면 해당 폼을 보여줌
- CreateView : 폼을 보여주고 폼의 내용으로 DB 레코드를 신규 생성
- UpdateView : 폼을 보여주고 폼의 내용으로 기존 DB 레코드를 수정
- DeleteView : 삭제 컨펌 폼을 보여주고 기존 DB 레코드를 삭제
- Generic Date View
- ArchiveIndexView : 조건에 맞는 여러 개의 객체 및 객체들에 대한 날짜 정보 노출
- YearArchiveView : 연도가 주어지면 연도에 해당하는 객체들 노출
- MonthArchiveView : 연, 월이 주워지면 그에 해당하는 객체들 노출
- WeekArchiveView : 연도와 주차가 주어지면 그에 해당하는 객체들 노출
- DayArchiveView : 연, 월, 일이 주어지면 그 날짜에 해당하는 객체들 노출
- TodayArchiveView : 오늘 날짜에 해당하는 객체들을 보여줌
- DateDetailView : 연, 월, 일, 기본키(또는 슬러그)가 주어지면 그에 해당하는 특정 객체 하나에 대한 상세 정보 노출
- View
- 모든 클래스형 뷰의 기본이 되는 최상위 뷰이며 모든 뷰는 해당 클래스를 상속 받음
- 다만 이 뷰를 직접 상속 받아 코딩하는 경우는 많지 않음
class TestView(View):
def get(self, request, *args, **kwargs):
return HttpResponse('안녕 마이 월드야')
- TemplateView
- 단순하게 화면에 보여줄 템플릿 파일을 처리하는 정도의 간단한 뷰이며 템플릿 파일만 지정해줘도 됨
class HomeView(TemplateView):
template_name = 'home.html'
- RedirectView
- 주어진 URL로 리다이렉트시켜주는 제네릭 뷰이며 URL 속성이 필수
- URL 대신 URL 패턴명이 주어져도 상관 없음
- URL을 알 수 없다면 410 에러 발생
- 복잡한 로직 없이 리다이렉트만을 원할 때 사용하는 뷰
class TestRedirectView(RedirectView):
url = 'blog/post/'
- DetailView
- ListView와 더불어 가장 많이 사용되는 제네릭 뷰
- 특정 객체 하나에 대한 정보를 보여줌
- 테이블에서 특정 레코드를 읽은 후 그 레코드를 object 컨텍스트 변수에 담아 템플릿에 넘겨줌
- 템플릿 파일에서는 {{object}} 변수를 사용해 레코드 정보들을 출력
- 테이블만 지정해도 특정 레코드를 가져올 수 있는 이유 : URLConf에서 설정이 가능
- DetailView 제네릭 뷰를 사용할 경우 테이블은 뷰 클래스에서 지정하고 레코드 검색용 키는 URLConf에서 지정
- 레코드 검색용 키는 보통 기본키를 사용하는데 예제처럼 unique 할 경우 slug를 사용하기도 함
class PostDV(DetailView):
model = Post
re_path(R'^post/(?P<slug>[-\w]+)$/, views.PostDV.as_view(), name='post_detail')
- ListView
- DetailView와 마찬가지로 자주 사용하는 제네릭 뷰
- 여러 객체의 리스트를 보여주는 뷰
- 테이블에서 모든 레코드를 읽은 후 그 레코드들을 object_list 컨텍스트 변수에 담아 템플릿에 넘김
- 템플릿에서는 {{object_list}} 변수를 사용해 레코드 정보들을 출력
class PostLV(ListView):
model = Post
- FormView
- 폼을 보여주기 위한 제네릭 뷰이며 폼을 지정해주는 form_class와 폼을 렌더링하는데 필요한 template_name 속성이 주요 속성
- 추가적으로 폼 처리가 성공한 후에 리다이렉트 목적지 URL을 지정하는 success_url 속성도 필요
- 폼 처리에 대한 복잡한 과정을 FormView가 알아서 해줌
- get, post에 따른 처리 방식 차별화
- form 데이터 validation
- 리다이렉트
- 개발자는 필요한 속성, 메서드만 오버라이딩 해주면 됨
class SearchFormView(FormView):
form_class = PostSearchForm
template_name = 'blog.post_search.html'
def form_valid(self, form):
searchWord = form.cleaned_data['search_word']
post_list = Post.objects.filter(Q(title_icontains=searchWord) | Q(description_icontains=searchWord) | Q(content_icontains=searchWord)).distinct()
context = {}
context['form'] = form
context['search_term'] = searchWord
context['object_list'] = post_list
return render(self.request, self.template_name, context)
- CreateView
- 새로운 레코드를 생성해서 테이블에 저장해주는 뷰
- 레코드 정보를 입력받을 수 있는 폼이 필요하며 FormView의 기능을 포함함
- 모델 정의로부터 폼을 자동으로 만들어주는 기능과 데이터베이스에 레코드를 저장하는 기능이 더 추가된 것
- 항상 작업 대상이 되는 테이블이 있으므로 그 테이블 정의로부터 폼을 만들 수 있음
- 작업 대상 테이블을 model 속성으로 지정하며 폼을 만들 때 사용할 필드를 fields 속성으로 지정
- 처리가 성공한 후에 이동할 URL을 success_url 속성으로 지정
- form_valid() 메서드를 오버라이딩 해서 폼의 owner 필드에 현재 로그인한 사용자를 자동으로 채워줌
class PostCreateView(LoginRequiredMixin, CreateView):
model = Post
fields = ['title', 'slug', 'description', 'content', 'tags']
initial = {'slug' : 'auto-filling-do-not-input'}
success_url = reverse_lazy('blog:index')
def form_valid(self, form):
form.instance.owner = self.request.user
return super().from_valid(form)
- UpdateView
- 테이블에 이미 있는 레코드를 수정하는 제네릭 뷰
- CreateView의 기능과 매우 유사하고 레코드를 신규로 생성하는 것이 아닌 기존 레코드를 수정한다는 점
- 아래 예제는 CreateView 예제와는 달리 이미 owner 필드가 채워져 있을 것이므로 form_valid() 메서드 오버라이딩 필요 없음
- DetailView와 동일하게 수정할 레코드를 UrlConf에서 지정해야 함
class PostUpdateView(LoginRequiredMixin, UpdateView):
model = Post
fields = ['title', 'slug', 'description', 'content', 'tag']
success_url = reverse_lazy('blog:index')
path('<int:pk>/update/', views.PostUpdateView.as_view(), name="update")
- DeleteView
- 기존 객체를 삭제하기 위한 제네릭 뷰
- 삭제 처리는 내부에서 이뤄지고 코드에 나타나는 것은 삭제 확인 화면
- UpdateView와 처리 과정은 비슷하나 폼 모습이 다름
- Create, UpdateView와는 달리 삭제 확인용 폼만 필요하므로 입력 항목이 필요 없고 모델 정의를 참조하지도 않음
- 작업 대상 테이블을 model 속성으로 지정하고 success_url을 지정
- 마찬가지로 URLConf에서 수정할 레코드를 지정
class PostDeleteView(LoginRequiredMixin, DeleteView):
model = Post
success_url = reverse_lazy('blog:index')
path('<int:pk>/delete/', views.PostDeleteView.as_view(), name="delete")
- ArchiveIndexView
- 여러 개의 객체를 대상으로 하여 날짜를 기준으로 리스팅 해주는 뷰
- 날짜 기반 제네릭 뷰의 최상위 뷰이며 대상이 되는 모든 객체를 날짜 기준 내림 차순으로 보여줌
- 기준으로 정할 날짜 필드를 의미하는 date_field 속성이 중요
- 템플릿에 넘겨주는 컨텍스트 변수 중에서 object_list (객체들 리스트) 와 date_list (대상 객체들의 연도) 가 있음
class PostAV(ArchiveIndexView):
model = Post
date_field = "modify_dt"
- YearArchiveView
- 연도가 주어지면 여러 개의 객체를 대상으로 가능한 월을 알려주는 제네릭 뷰
- 디폴트 동작은 객체들을 출력하는 것이 아닌, 객체의 날짜 필드를 조사해 월을 추출
- 객체들을 알고 싶을 경우 make_object_list 속성을 True로 지정해야 함
- model 속성, date_field 속성을 지정하는 것은 ArchiveIndexView와 동일
- 인자를 URLConf에서 추출
class PostYAV(YearArchiveView):
model = post
date_field = "modify_dt"
make_object_list = True
path("archive/<int:year>/", views.PostYAV.as_view(), name="post_year_archive")
- MonthArchiveView
- 주어진 연/월에 해당하는 객체를 보여줌
- 마찬가지로 연/월 인자는 URLConf에서 지정
- make_object_list 속성 가지고 있음 (기본 : false)
class PostMAV(MonthArchiveView):
model = Post
date_field = 'modify_dt'
path('archive/<int:year>/<str:month>/', views.PostMAV.as_view(), name='post_month_archive')
- WeekArchiveView
- 주어진 연도 / 주에 해당하는 객체를 보여줌
- 마찬가지로 연도 / 주 인자는 URLConf에서 지정
- make_object_list 속성 가지고 있음 (기본 : false)
- DayArchiveView
- 주어진 연/월/일에 해당하는 객체를 보여줌
- 마찬가지로 연도 / 주 인자는 URLConf에서 지정
- make_object_list 속성 가지고 있음 (기본 : false)
- TodayArchiveView
- 오늘 날짜에 해당하는 객체를 보여줌
- 연/월/일 인자가 필요하지 않음 -> URL이 들어올 경우 뷰 내부에서 datetime.date.today() 함수로 오늘 날짜를 알아내 알아서 처리
- make_object_list 속성 가지고 있음 (기본 : false)
- DateDetailView
- 날짜 기준으로 특정 객체를 찾아 그 객체의 상세 정보를 보여주는 뷰
- DetailView와 기능이 비슷하지만 차이점이라면 객체를 찾는데 사용하는 인자로 연/월/일 정보를 추가로 사용 (즉, 기본 키 또는 slug 인자 + 연/월/일 인자)
- model 속성이나 date_field 속성을 지정하는 것은 ArchiveIndexView와 동일
- 제네릭 뷰의 작업 대상 객체 지정
- 작업 대상이 반드시 테이블이어야 하는 것은 아님
- 테이블의 레코드뿐만 아니라 일반 객체들이 들어 있는 QuerySet 객체면 제네릭 뷰의 작업 대상이 됨
- 이를 위해 model 속성 외에 queryset 속성 또는 get_queryset() 메서드를 제공
- View, TemplateView, RedirectView, FormView 등 작업 대상을 지정할 필요가 없는 제네릭 뷰는 model이나 queryset 속성을 사용하지 않음
(2) 제네릭 뷰 오버라이딩
- 제네릭 뷰에서 제공하는 속성과 메소드를 확인해 무엇을 오버라이딩할 지 결정하여야 함
- 대표적인 속성 오버라이딩
- model
- queryset
- 기본 뷰와 FormView를 제외하고 사용, 작업 대상이 되는 QuerySet 객체를 지정
- queryset 속성 지정 시 model 속성은 무시됨
- template_name
- 모든 제네릭 뷰에서 사용하는 속성. 템플릿 파일명을 문자열로 지정
- context_object_name
- 기본 뷰 제외 모든 제네릭 뷰에서 사용, 템플릿 파일에서 사용할 컨텍스트 변수명을 지정
- paginate_by
- ListView와 날짜 기반 뷰에서 사용, 페이징 기능이 활성화된 경우 페이지 당 몇 개 항목을 출력할 지 정수로 저장
- date_field
- 날짜 기반 뷰에서 기준이 되는 필드를 지정. 해당 필드를 기준으로 연/월/일을 검사
- 필드 타입은 DateField 혹은 DateTimeField여야 함
- make_object_list
- YearArchiveView 사용 시 해당 년에 맞는 객체들의 리스트를 생성할지 여부를 지정
- True 지정 시 객체들의 리스트를 만들고 그 리스트를 템플릿에서 사용할 수 있음
- False 지정 시 queryset 속성에 None이 할당
- form_class
- FormView, CreateView, UpdateView에서 사용, 폼을 만드는데 사용할 클래스 지정
- initial
- FormView, CreateView, UpdateView에서 사용, 폼에 사용할 초기 데이터를 딕셔너리로 지정
- fields
- CreateView, UpdateView에서 사용, 폼에 사용할 필드를 지정
- success_url
- FormView, CreateView, UpdateView, DeleteView에서 사용, 폼에 대한 처리가 성공한 후 리다이렉트 될 URL을 지정
- 대표적인 메서드 오버라이딩
- get_queryset()
- 기본 뷰와 FormView를 제외하고 모든 제네릭 뷰에서 사용하는 메서드
- 출력 객체를 검색하기 위한 대상 QuerySet 객체 또는 출력 대상인 객체 리스트를 반환
- 디폴트는 queryset 속성값을 반환
- queryset 속성이 지정되지 않을 경우 모델 매니저 클래스의 all() 메서드를 호출해 QuerySet 객체를 생성하고 이를 반환
- get_context_data(*kwargs)
- TemplateView를 포함해 모든 제네릭 뷰에서 사용, 템플릿에서 사용할 컨텍스트 데이터를 반환
- form_valid(form)
- FormView, CreateView, UpdateView에서 사용, get_success_url() 메서드가 반환하는 URL로 리다이렉트를 수행
- 오버라이딩 예제
- queryset 속성 오버라이딩
- 포스트 리스트를 모두 보여주는 것이 아니라 5개만 보여주고 싶을 경우
class TestPostLV(ListView):
queryset = Post.objects.all()[:5]
- get_queryset() 메서드 오버라이딩
- 포스트 글에 특정 단어가 들어 있는 객체만 보여주는 로직으로 변경, 단어는 URL로 받음
- Q 객체 (Querydsl의 Q Class와 같은 기능인가?) 를 사용한 예제
path('test/<str:word>/', views.TestPostLV.as_view(), name="test_post")
class TestPostLv(ListView):
def get_queryset(self):
return Post.ojbects.filter(Q(content_icontains=self.kwargs['word'])).distinct()
class TestPostLv(ListView):
...
template_name = 'blog/post_test.html'
- get_context_data() 메서드 오버라이딩
- 뷰에서 템플릿 파일에 넘겨주는 컨텍스트 데이터를 추가하거나 변경할 수 있음
- ListView에서 사용하는 object_list, DetailView에서 사용하는 object가 예시
- object_list나 object와 같은 디폴트 컨텍스트 변수 이외에 추가로 지정하고 싶은 컨텍스트 변수가 있으면 오버라이딩
class TestPostLV(ListView):
context_object_name = 'posts'
def get_queryset(self):
return Post.ojbects.filter(Q(content_icontains=self.kwargs['word'])).distinct()
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['SearchWord'] = self.kwargs(['word'])
return context
<h1>Blog List - contains the word '{{ SearchWord }}'</h1>
(3) 제네릭 뷰의 처리 흐름
- ListView
- setup() : 공통으로 사용할 속성들을 미리 정의하는 메서드, self.request, self.args, self.kwargs는 미리 정의되며 그 외 체구할 것이 있으면 오버라이딩함
- dispatch() : 클라이언트 요청의 HTTP 메서드를 검사, 뷰 클래스에 정의된 적절한 처리 메서드를 호출
- 찾지 못할 경우 http_method_not_allowed() 호출
- get() : 메인 처리 메서드
- get_queryset() : 작업 대상 객체들의 리스트를 반환. 리스트는 QuerySet 객체와 같은 순환 가능(이터러블) 객체여야 함
- get_context_data() : 템플릿에서 사용할 컨텍스트 데이터를 반환하는 메서드, get_context_object_name() 메서드를 호출
- get_context_object_name() : 템플릿에서 사용할 컨텍스트 변수명을 반환. 속성이 지정되지 않을 경우 모델명소문자_list로 컨텍스트 변수명을 사용 (Bookmark일 경우 bookmark_list)
- render_to_response() : 최종 응답인 self.response_class 객체를 반환. get_template_names()를 호출
- get_template_names() : 템플릿 파일명을 담은 리스트를 반환, template_name 속성이 지정된 경우 template_name을 리스트에 담아 반환
- DetailView
- setup() : 공통으로 사용할 속성들을 미리 정의하는 메서드, self.request, self.args, self.kwargs는 미리 정의되며 그 외 체구할 것이 있으면 오버라이딩함
- dispatch() : 클라이언트 요청의 HTTP 메서드를 검사, 뷰 클래스에 정의된 적절한 처리 메서드를 호출
- 찾지 못할 경우 http_method_not_allowed() 호출
- get() : 메인 처리 메서드
- get_object() : 작업 대상 객체 하나를 반환. 이를 위해 먼저 get_queryset()을 호출하여 검색 대상 객체 리스트를 얻는데 검색 시 pk로 먼저 검색을 시도하고 pk가 주어지지 않을 경우 slug로 검색을 수행
- get_queryset() : 작업 대상 객체들의 리스트를 반환. 리스트는 QuerySet 객체와 같은 순환 가능(이터러블) 객체여야 함. 디폴트는 queryset 속성값을 리턴하며, 속성이 지정되지 않을 경우 모델 매니저 클래스의 all() 메서드를 호출해 QuerySet 객체를 생성하고 이를 반환
- get_context_data() : 템플릿에서 사용할 컨텍스트 데이터를 반환하는 메서드, get_context_object_name() 메서드를 호출
- get_context_object_name() : 템플릿에서 사용할 컨텍스트 변수명을 반환. 속성이 지정되지 않을 경우 모델명소문자_list로 컨텍스트 변수명을 사용 (Bookmark일 경우 bookmark_list)
- render_to_response() : 최종 응답인 self.response_class 객체를 반환. get_template_names()를 호출
- get_template_names() : 템플릿 파일명을 담은 리스트를 반환, template_name 속성이 지정된 경우 template_name을 리스트에 담아 반환
(4) MRO
- 파이썬은 다중 상속이 가능한 언어이므로 장고의 제네릭 뷰에서도 다중 상속을 허용
- MROMethod Resolution Order 속성 : 동일한 이름을 가진 메서드가 둘 이상의 부모 클래스에 존재할 경우 어느 메서드를 먼저 사용해야 할 지 결정하는 알고리즘, 클래스마다 메서드를 찾는 순서를 정함
- 장고와 제네릭 뷰를 사용할 경우에는 MRO 문제로 어려움을 겪는 경우는 많지 않음
- 다만 개발자가 작성한 클래스를 상속받을 때 MRO 문제를 잘 여겨봐야함
- 믹스인(Mixin) 클래스 : 자신의 인스턴스를 만드는 용도보다는 다른 클래스에게 부가 기능을 제공하기 위한 용도로 사용되는 클래스 (데코레이터 느낌)
(5) 제네릭 뷰의 페이징 처리
- 페이징 처리 기능은 제네릭 뷰와 같은 클래스형 뷰 뿐만 아니라 함수형 뷰에서도 사용할 수 있는 기능
- 페이징 기능 활성화
- paginate_by 속성을 지정하면 페이징 기능이 활성화되고 객체 리스트는 페이지별로 구분이 됨
- paginate_by 속성은 페이지당 객체의 개수를 의미 (limit)
- 페이징 기능 활성화 시 URL에 페이지 번호 지정 방법
- URL 경로에 페이지 번호를 지정하며 URLConf에서 이를 추출해 뷰에 넘겨주는 방법
- URL 쿼리 문자열에 페이지 번호를 지정
- 템플릿 파일에서 페이징 기능을 위해 사용되는 컨텍스트 변수
- object_list : 화면에 보여줄 객체 리스트, context_object_name 속성으로 지정된 컨텍스트 변수도 object_list와 동일한 값을 가짐
- is_paginated : 출력 결과가 페이징 처리되는지 여부를 알려주는 불린 변수. 만일 페이지 크기가 지정되지 않았거나 대상 객체 리스트가 페이지로 구분되지 않는 경우는 이 값이 False가 됨
- paginator : Paginator 클래스의 객체. 페이징 처리가 안 되는 경우 이 값은 None으로 세팅
- page_obj : Page 클래스의 객체. 페이징 처리가 안 되는 경우 이 값은 None으로 세팅
- Paginator 클래스
- 인자
- object_list : 필수 인자, 페이징 대상이 되는 객체 리스트
- per_page : 필수 인자, 페이지 당 최대 항목 수
- orphans : 마지막 페이지에 넣을 수 있는 항목의 최소 개수
- allow_empty_first_page : 첫 페이지가 비어 있어도 되는지 결정하는 불린 타입 인자
- 메서드
- Paginator.page(number) : Page 객체를 반환. number 인자는 1부터 시작
- Paginator.get_page(number) : Page 객체를 반환. number 인자는 1부터 시작, 인자가 숫자가 아니면 첫 페이지를 반환, 인자가 음수이거나 최대 페이지 숫자보다 크면 마지막 페이지 반환
- 속성
- Paginator.count : 항목의 총 개수
- Paginator.num_pages : 페이지의 총 개수
- Paginator.page_range : 1부터 시작하는 페이지의 범위
class Paginator(object_list, per_page, orphans=0, allow_empty_first_page=True)
- Page 클래스
- 인자
- object_list : Paginator 클래스의 object_list 인자와 동일
- number : 몇번째 페이지인지 지정하는 페이지 인덱스
- paginator : 페이지를 생성해주는 Paginator 객체
- 메서드
- Page.has_next(), has_previous() : 다음, 이전 페이지 유무 반환
- Page.has_other_pages() : 다음 또는 이전 페이지가 있는지 반환
- Page.next_page_number(), previous_page_number() : 다음, 이전 페이지 번호 반환
- Page.start_index() : 해당 페이지 첫번째 항목의 인덱스 반환, 1부터 카운터
- 페이지당 10개, 11번째 페이지의 첫번째 인덱스는 101
- Page.end_index() : 해당 페이지 마지막 항목의 인덱스 반환, 1부터 카운터
- 페이지당 10개, 11번째 페이지의 마지막 인덱스는 110
- 속성
- Page.object_list : 현재 페이지의 객체 리스트
- Page.number : 현재 페이지의 번호 (1부터 카운트)
- Page.paginator : 현재 페이지를 생성한 Paginator 객체
class Page(object_list, number, paginator)
(6) 단축 함수
- 웹 개발 시 자주 사용하는 공통적인 기능들을 만든 함수로, 클래스형 뷰보다는 함수형 뷰에서 많이 사용 (클래스형 뷰에서는 메서드로 제공하고 있기 때문)
- render()
- 템플릿 파일과 컨텍스트 사전을 인자로 받아 렌더링 처리 후 HttpResponse 객체를 반환
- request, template_name을 제외한 나머지 인자는 선택 인자
- request(필수) : 클라이언트로부터 보내온 요청 객체. 내부적으로는 요청 객체에 담겨 있는 파라미터들을 사용해 RequestContext 객체를 만들고 이를 컨텍스트 데이터에 추가
- template_name(필수) : 템플릿 파일명. 복수 개가 주어질 경우 가장 먼저 찾게 되는 파일이 사용됨
- context : 템플릿 컨텍스트 데이터가 담긴 파이썬 딕셔너리 객체
- content_type : 최종 결과에 사용될 MIME 타입, 디폴트는 DEFAULT_CONTENT_TYPE
- status : 응답에 포함될 상태 코드, 디폴트는 200
- using : 템플릿 로딩에 사용되는 템플릿 엔진 이름
render(request, template_name, context=None, content_type=None, status=None, using=None)
- redirect()
- to 인자로 주어진 URL로 이동하기 위한 HttpResponseRedirect 객체를 반환
- to 인자의 종류
- 이동하기 위한 URL을 직접 지정 (절대 경로, 상대 경로 모두 가능)
- 모델명을 지정할 경우 모델의 get_absolute_url() 메서드에서 반환하는 URL로 리다이렉트
- URL 패턴의 이름 지정 시 reverse() 함수를 호출하며 그 패턴명을 인자로 넘겨지고 reverse() 함수의 결과로 반환되는 URL로 리다이렉트
redirect(to, *args, permanent=False, **kwargs)
- get_object_or_404()
- klass 모델에 해당하는 테이블에서 arg 또는 kargs 조건에 맞는 레코드 검색
- 레코드 존재 시 레코드 반환, 없을 경우 404 에러 발생
- 조건에 맞는 레코드가 2개 이상일 경우 MultipleObjectsReturned 예외 발생
- klass는 Model 또는 Manager 클래스, QuerySet 객체일 수 있음
get_object_or_404(klass, *args, **kargs)
- get_list_or_404()
- klass 모델에 해당하는 테이블에서 arg 또는 kargs 조건에 맞는 레코드들을 검색
- 레코드 존재 시 레코드 반환, 없을 경우 404 에러 발생
- klass는 Model 또는 Manager 클래스, QuerySet 객체일 수 있음
get_list_or_404(klass, *args, **kargs)