views.py
의 함수형 뷰(FBV, Funtion Based View)를 클래스형 뷰(CBV, Class Based View)로 바꿔보도록 한다.
from django.views import View
을 사용하면 FBV와 비슷하게 각 method별 작업을 해줘야 하기 때문에 Generic View를 사용하도록 한다.
ListView
class PageListView(ListView):
model = Page
ordering = ["-dt_created"]
paginate_by = 8
# template_name = "diarys/page_list.html"
# context_object_name = "pages"
template_name
: 템플릿을 따로 지정하지 않으면 ListView는 "(앱)/(Model)_list.html"을 찾기 때문에 템플릿 파일의 이름과 구조를 같게 하면 생략 가능하다.
context_object_name
: 템플릿으로 넘기는 context의 키 값을 정하는 것으로 기본값은 "object_list" or "(Model)_list"로 list는 복수인 경우가 많기 때문에 변수의 어미에 list가 붙는다. 템플릿에서 따로 사용하고 싶은 값이 있다면 설정하고 기본값을 사용한다면 생략 가능하다.
DetailView
class PageDetailView(DetailView):
model = Page
# template_name = "diarys/page_detail.html"
# pk_url_kwarg = "page_id"
# context_object_name = "page"
template_name
: DetailView에서는 "앱/(Model)_detail.html"
pk_url_kwarg
: urls.py
의 정수형 파라미터를 'page_id'가 아닌 'pk'를 사용하면 생략 가능하다. urls.py
는 추후 기술
context_object_name
: ListView와 달리 DetailView는 한 데이터만 가져오는 단수형이기 때문에 기본값으로 'object' or "(Model)"을 가진다.
CreateView
class PageCreateView(CreateView):
model = Page
form_class = PageForm
# template_name = "diarys/page_form.html"
def get_success_url(self):
return reverse("page-detail", kwargs={"pk": self.object.id})
template_name
: CreateView에서는 "앱/(Model)_form.html"
get_success_url
: form이 성공적으로 생성되면 이동할 url설정
UpdateView
class PageUpdateView(UpdateView):
model = Page
form_class = PageForm
# template_name = "diarys/page_form.html"
# pk_url_kwarg = "page_id"
def get_success_url(self):
return reverse("page-detail", kwargs={"pk": self.object.id})
DeleteView
class PageDeleteView(DeleteView):
model = Page
# template_name = "diarys/page_confirm_delete.html"
# pk_url_kwarg = "page_id"
# context_object_name = "page"
def get_success_url(self):
return reverse("page-list")
template_name
: DeleteView에서는 삭제하기 전 마지막 확인을 위해 "(Model)_delete.html"이 아닌 "(Model)_confirm_delete.html"파일을 찾아간다.
urls.py
from django.urls import path
from . import views
urlpatterns = [
path("", views.index, name="index"),
path("diary/", views.PageListView.as_view(), name="page-list"),
path("diary/info/", views.info, name="info"),
path("diary/write/", views.PageCreateView.as_view(), name="page-create"),
path("diary/page/<int:pk>/", views.PageDetailView.as_view(), name="page-detail"),
path(
"diary/page/<int:pk>/edit/",
views.PageUpdateView.as_view(),
name="page-update",
),
path(
"diary/page/<int:pk>/delete/",
views.PageDeleteView.as_view(),
name="page-delete",
),
]
path의 두번째 파라미터는 FBV는 views.(함수)이지만 CBV는 뒤에 as_view()
를 넣어줘야 한다.