Django Class-Based Views(클래스형 뷰)🧡

2021. 8. 12. 16:59·Programming
반응형

클래스형 뷰란? (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'),
]

 

반응형
'Programming' 카테고리의 다른 글
  • AccessMixin 정리 노트
  • [Django]allauth URL & 유용한 세팅들🔎
  • pagination 구현하기📝
  • Django 페이지네이션(Pagination)🗒
기록하기-
기록하기-
  • 기록하기-
    꾸밈없이 끊임없이
    기록하기-
  • 전체
    오늘
    어제
    • 분류 전체보기
      • Programming
      • Episode
  • 블로그 메뉴

    • 깃허브
    • 링크드인
  • 링크

    • Github
    • LinkedIn
  • 공지사항

  • 인기 글

  • 태그

    Python 문법
    Django
    파이썬 기초
    파이썬 문법
    파이썬
    python
    python class
    파이썬문법
    python 기초 문법
    파이썬기초
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
기록하기-
Django Class-Based Views(클래스형 뷰)🧡
상단으로

티스토리툴바