전체 페이지뷰

2016년 12월 12일 월요일

Blog 앱 만들기 5, view 코딩

앞의 URLconf에서 지정한 제너릭뷰를 코딩합니다.
필요한 제너릭뷰가 상당히 많아 코드가 좀 깁니다.



전에 만든 북마크앱의 뷰는 변하는게 없으므로 blog/view.py만 수정하겠습니다.

(myvenv) D:\myDjango>cd blog
(myvenv) D:\myDjango\blog>subl views.py


from django.views.generic import ListView, DetailView
from django.views.generic.dates import ArchiveIndexView, YearArchiveView, MonthArchiveView
from django.views.generic.dates import DayArchiveView, TodayArchiveView
from blog.models import Post
# Create your views here.
# ListView
class PostLV(ListView):
    model = Post
    template_name = 'blog/post_all.html'
    context_object_name = 'posts'
    paginate_by = 2
# DetailView
class PostDV(DetailView):
    model = Post
# ArchiveView
class PostAV(ArchiveIndexView):
    model = Post
    date_field = 'modify_date'
class PostYAV(YearArchiveView):
    model = Post
    date_field = 'modify_date'
    make_object_list = True
class PostMAV(MonthArchiveView):
    model = Post
    date_field = 'modify_date'
class PostDAV(DayArchiveView):
    model = Post
    date_field = 'modify_date'
class PostTAV(TodayArchiveView):
    model = Post
    date_field = 'modify_date'
cs

도입부에 뷰를 작성하는데 필요한 모든 클래스형 제너릭뷰를 임포트 하고,
테이블 조회를 위해 Post 모델 클래스도 임포트 합니다.

PostLV

ListView를 상속받습니다. 템플릿 이름을 'blog/post_all.html'로 지정합니다(지정하지 않으면 디폴트는 blog/post_list.html 이 됩니다). 컨텍스트 object name도 'posts'라고 설계에 따라 지정합니다(디폴트 변수명은 'object_list'입니다). paginate_by로 한 페이지에 보여주는 객체 리스트의 숫자를 두개로 지정합니다. paginate_by를 지정하면 자동으로 페이징 기능을 사용할 수 있습니다.

PostDV

DetailView를 상속받습니다.테이블에서 특정 객체를 받아와 상세 정보를 출력합니다. 모델코딩 시 slug를 unique로 지정했으므로 조회를 위한 키는 기본 키가 아닌 'slug'가 됩니다.
특별히 다른 속성이 필요치 않으므로 다른 것들을 지정하지는 않습니다.

PostAV

전체 포스트의 아카이브에 대한 내용이므로 ArchiveIndexView 제너릭 뷰를 상속받습니다. date_field 정렬기준을 'modify_date'로 지정합니다.

PostYAV

연단위 글의 목록을 보여주기 위한 부분입니다. YearArchiveView 제너릭뷰를 상속받습니다. 역시 date_field 정렬기준을 'modify_date'로 지정하여 수정일로 만들어주고, make_object_listTrue로 지정해주는데, 이것을 지정해야 해당년도에 해당하는 객체의 리스트를 템플릿에 넘겨줄 수 있습니다(그러면 템플릿에서 object_list 변수를 사용할 수 있습니다).

PostMAV, PostDAV, PostTAV의 내용은 동일하므로 넘어가겠습니다.

이처럼 제너릭뷰는 상속받고, 필요한 속성만 지정해주면 되므로 구체적인 구현을 신경쓸 필요가 없습니다. 하나하나의 속성 구현을 다 직접해야 했다면 너무나 힘든 일이 되었을 것입니다.

각 제너릭에 대한 속성과 메소드를 참고하실 분은 여기를 확인하세요.


댓글 없음:

댓글 쓰기