TIL_20230308_Django 프레임워크 보강 02

창고·2023년 3월 8일
0

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/'
    # 혹은 아래와 같이 패턴명을 지정해도 됨
    #pattern_name = 'blog:post_list'
  • DetailView
    • ListView와 더불어 가장 많이 사용되는 제네릭 뷰
    • 특정 객체 하나에 대한 정보를 보여줌
    • 테이블에서 특정 레코드를 읽은 후 그 레코드를 object 컨텍스트 변수에 담아 템플릿에 넘겨줌
    • 템플릿 파일에서는 {{object}} 변수를 사용해 레코드 정보들을 출력
    • 테이블만 지정해도 특정 레코드를 가져올 수 있는 이유 : URLConf에서 설정이 가능
    • DetailView 제네릭 뷰를 사용할 경우 테이블은 뷰 클래스에서 지정하고 레코드 검색용 키는 URLConf에서 지정
    • 레코드 검색용 키는 보통 기본키를 사용하는데 예제처럼 unique 할 경우 slug를 사용하기도 함
class PostDV(DetailView):

	model = Post # 테이블만 지정했음, URLConf 설정으로 레코드를 읽어올 수 있음
# urls.py
# Example: /blog/post/django-example
re_path(R'^post/(?P<slug>[-\w]+)$/, views.PostDV.as_view(), name='post_detail')

# /blog/post/django-example로 요청이 들어올 경우 PostDV.as_view() 를 호출할 시
# 인자로 사전 데이터인 ['slug' : 'django-example']을 넘겨주며
# 이 slug 인자로 Post 테이블을 검색해 slug 칼럼이 django-example인 레코드를 찾게 됨
  • 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')
# urls.py
# Example: /blog/99/update/
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')
# urls.py
# Example: /blog/99/delete/
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 # 객체 리스트 추출
# urls.py
# Example : /blog/archive/2019/
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'
# Example: /blog/archive/2019/nov
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
    • 기본 뷰 (View, TemplateView, RedirectView)와 FormView를 제외하고 모든 제네릭 뷰에서 사용하는 속성
    • 작업 대상 데이터가 들어 있는 모델을 지정. model 대신 queryset 속성 지정도 가능
      # 둘이 동일한 기능, 의미
      model = Bookmark
      queryset = Bookmark.objects.all() # queryset 속성 사용 시 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):

	#model = Post # 주석 처리
    queryset = Post.objects.all()[:5] # 추가
  • get_queryset() 메서드 오버라이딩
    • 포스트 글에 특정 단어가 들어 있는 객체만 보여주는 로직으로 변경, 단어는 URL로 받음
    • Q 객체 (Querydsl의 Q Class와 같은 기능인가?) 를 사용한 예제
#urls.py
#Example: /blog/test/
	#path('test/', vies.TestPostLV.as_view(), name="test_post") # 주석 처리
    #Example: /blog/test/word/ # 추가
    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()
  • template_name 속성 오버라이딩
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)
profile
공부했던 내용들을 모아둔 창고입니다.

0개의 댓글