클래스형 뷰란? (Class-Based Views)
- 개발자들이 자주 쓸만한 view를 클래스로 만들어 준 것
클래스형 뷰 구현하기! ⚒
*기존의 함수형태
def page_create(request):
if request.method == 'POST':
form = PageForm(request.POST)
if form.is_valid():
new_page = form.save()
return redirect('page-detail', page_id=new_page.id)
else:
form = PageForm()
return render(request, 'diary/page_form.html', {'form': form})
⬇️
*클래스형 뷰로 변경 한 상태
class PageCreateView(View):
def get(self, request):
form = PageForm()
return render(request, 'diary/page_form.html', {'form':form})
def post(self, request):
form = PageForm(request.POST)
if form.is_valid():
new_page = form.save()
return redirect('page-detail', page_id=new_page.id)
변경 후 urls.py파일에서 path 변경
path('diary/write/', views.PageCreateView.as_view, name='page-create'),
제네릭 뷰란? (Generic View)
개발자들이 자주 쓸만한 view를 하나의 형태로 만들어 둔 것
CreateView
1. django.views.generic으로 부터 CreateView를 import
views.py
class PageCreateView(CreateView):
model = Page
form_class = PageForm
template_name = 'diary/page_form.html'
def get_success_url(self):
return reverse('page-detail', kwargs={'page_id': self.object.id})
2. urls.py로 가서 PageCreateView를 사용할 수 있게 변경
urlpatterns = [
...
path('diary/write/', views.PageCreateView.as_view(), name='page-create'),
...
]
ListView
1.django.views.generic으로 부터 ListView를 import 한 후 ListView를 상속받아 PageListView를 구현
from django.views.generic import ListView
class PageListView(ListView):
model = Page
template_name = 'diary/page_list.html'
ordering = ['-dt_created']
paginate_by = 8
page_kwarg = 'page'
2. page_list.html템플릿에서 'page'라는 키워드를 generic을 이용한 ListView에서의 키워드인 'page_obj'로 수정
{% extends './base.html' %}
{% block content %}
{% if page_obj.object_list %} <!-- 수정해 주세요. -->
<div class="wrap-note">
<div class="note">
<div class="note-list">
<ul>
{% for obj in page_obj.object_list %} <!-- 수정해 주세요. -->
<li>
...
</li>
{% endfor %}
</ul>
</div>
<div class="paging">
{% if page_obj.has_previous %} <!-- 수정해 주세요. -->
<a href="?page=1" class="first">처음</a>
<a href="?page={{page.previous_page_number}}" class="prev">이전</a> <!-- 수정해 주세요. -->
{% endif %}
...
{% if page_obj.has_next %} <!-- 수정해 주세요. -->
<a href="?page={{page.next_page_number}}" class="next">다음</a> <!-- 수정해 주세요. -->
<a href="?page={{page.paginator.num_pages}}" class="last">마지막</a> <!-- 수정해 주세요. -->
{% endif %}
</div>
</div>
</div>
{% else %}
<div class="wrap-default">
...
</div>
{% endif %}
{% endblock content %}
3. urls.py로 가서 page-list에 대해 함수형 뷰가 아닌 PageListView를 사용하도록 as_view 메소드를 이용
from django.urls import path
from . import views
urlpatterns = [
...
path('diary/', views.PageListView.as_view(), name='page-list'),
...
]
DetailView
1. django.views.generic으로 부터 DetailView를 import 한 후 DetailView를 상속받아 PageDetailView를 정의
from django.views.generic import DetailView
class PageDetailView(DetailView):
model = Page
template_name = 'diary/page_detail.html'
pk_url_kwarg = 'page_id'
2. urls.py로 가서 PageDetailView를 사용하도록 as_view 메소드를 이용해서 작성
from django.urls import path
from . import views
urlpatterns = [
...
path('diary/page/<int:page_id>/', views.PageDetailView.as_view(), name='page-detail'),
...
]
UpdateView
1.django.views.generic으로 부터 UpdateView를 Import 한 후 UpdateView를 상속받아 PageUpdateView를 정의
from django.views.generic import UpdateView
class PageUpdateView(UpdateView):
model = Page
form_class = PageForm
template_name = 'diary/page_form.html'
pk_url_kwarg = 'page_id'
def get_success_url(self):
return reverse('page-detail', kwargs={'page_id': self.object.id})
2.urls.py로 가서 PageUpdateView를 사용할 수 있도록 as_view 메소드를 이용해서 작성
from django.urls import path
from . import views
urlpatterns = [
...
path('diary/page/<int:page_id>/edit/', views.PageUpdateView.as_view(), name='page-update'),
...
]
DeleteView
1. django.views.generic으로 부터 DeleteView를 import 한 후 DeleteView를 상속받아 PageDeleteView를 정의
from django.views.generic import DeleteView
class PageDeleteView(DeleteView):
model = Page
template_name = 'diary/page_confirm_delete.html'
pk_url_kwarg = 'page_id'
def get_success_url(self):
return reverse('page-list')
2. urls.py로 가서 PageDeleteView를 사용할 수 있도록 as_view 메소드를 이용해서 작성
from django.urls import path
from . import views
urlpatterns = [
...
path('diary/page/<int:page_id>/delete/', views.PageDeleteView.as_view(), name='page-delete'),
]