Django에서는 웹 애플리케이션의 다양한 요청에 대해 기본적으로 사용할 수 있는 Generic Views를 제공합니다. 이 뷰들은 반복적인 코드 작성을 줄여주며, 다양한 상황에서 쉽게 재사용할 수 있습니다.


Display View

Django의 Generic Views는 다양한 데이터를 출력할 때 유용하게 사용됩니다. 그 중 ListViewDetailView는 매우 자주 사용되는 뷰입니다.

  • model: 데이터를 출력할 모델을 지정합니다.
  • template_name: 데이터를 출력할 템플릿을 지정합니다.
  • context_object_name: 템플릿에서 사용할 변수 이름을 지정합니다.
# urls.py

from django.urls import path
from .views import BookListView, BookDetailView

urlpatterns = [
    path('books/', BookListView.as_view(), name='book_list'), 
    path('book/<int:pk>/', BookDetailView.as_view(), name='book_detail'),
]

ListView

ListView는 특정 모델의 객체 목록을 출력하는 뷰입니다. 데이터를 한 번에 여러 개 출력할 수 있습니다.

# views.py

from django.views.generic import ListView
from .models import Book

class BookListView(ListView):
    model = Book
    template_name = 'book_list.html'
    context_object_name = 'books'
<!-- book_list.html -->

<ul>
  {% for book in books %}
    <li>{{ book.title }}</li>
  {% endfor %}
</ul>

DetailView

DetailView는 특정 모델의 객체를 하나씩 출력하는 뷰입니다. 개별 객체의 세부 정보를 확인할 수 있습니다.

# views.py

from django.views.generic import DetailView
from .models import Book

class BookDetailView(DetailView):
    model = Book
    template_name = 'book_detail.html'
    context_object_name = 'book'
<!-- book_detail.html -->

<h1>{{ book.title }}</h1>
<p>{{ book.description }}</p>

CRUD View

Django에서는 Create, Read, Update, Delete 작업을 쉽게 처리할 수 있는 여러 Generic Views를 제공합니다.

  • model: 데이터를 저장할 모델을 지정합니다.
  • fields: 입력 받을 필드를 지정합니다.
  • success_url: 데이터가 저장된 후 리디렉션할 URL을 지정합니다.
# urls.py

from django.urls import path
from .views import BookCreateView, BookUpdateView, BookDeleteView

urlpatterns = [
    path('book/create/', BookCreateView.as_view(), name='book_create'),
    path('book/<int:pk>/update/', BookUpdateView.as_view(), name='book_update'), 
    path('book/<int:pk>/delete/', BookDeleteView.as_view(), name='book_delete'),
]

CreateView

CreateView는 데이터를 생성할 때 사용됩니다. 폼을 자동으로 제공하고, 제출된 데이터를 데이터베이스에 저장합니다.

# views.py

from django.views.generic import CreateView
from .models import Book
from django.urls import reverse_lazy

class BookCreateView(CreateView):
    model = Book
    template_name = 'book_form.html'
    fields = ['title', 'description']
    success_url = reverse_lazy('book_list')

여기서는 reverse_lazy를 사용하여 URL을 동적으로 생성합니다.

UpdateView

UpdateView는 이미 존재하는 데이터를 수정할 때 사용됩니다.

# views.py

from django.views.generic import UpdateView
from .models import Book
from django.urls import reverse_lazy

class BookUpdateView(UpdateView):
    model = Book
    template_name = 'book_form.html'
    fields = ['title', 'description']
    success_url = reverse_lazy('book_list')

DeleteView

DeleteView는 데이터를 삭제할 때 사용됩니다.

# views.py

from django.views.generic import DeleteView
from .models import Book
from django.urls import reverse_lazy

class BookDeleteView(DeleteView):
    model = Book
    template_name = 'book_confirm_delete.html'
    success_url = reverse_lazy('book_list')

Dynamic URL

RedirectView

RedirectView는 사용자를 다른 페이지로 리디렉션할 때 사용됩니다. 주로 다른 URL로의 자동 이동을 구현할 때 유용합니다.

# urls.py

from django.urls import path
from .views import BookRedirectView

urlpatterns = [
    path('books/', BookRedirectView.as_view(), name='book_redirect'),
]
# views.py

from django.views.generic import RedirectView

class BookRedirectView(RedirectView):
    url = '/book-redirect/'
  • url: 리디렉션할 URL을 지정합니다. 사용자가 books/로 접근하면, /book-redirect/로 자동으로 이동됩니다.

reverse

요청을 처리하는 동안 URL을 즉시 생성합니다. 주로 뷰 함수 내에서 사용됩니다.

# views.py

from django.urls import reverse
from django.http import HttpResponseRedirect

def my_view(request):
    url = reverse('book_list') # URL을 동적으로 생성
    return HttpResponseRedirect(url)

reverse_lazy

URL이 요청될 때까지 생성하지 않고, 지연시키는 방식입니다. 주로 클래스 기반 뷰에서 사용됩니다. reverse_lazy는 클래스 기반 뷰에서 URL을 동적으로 생성할 때 유용합니다.

# views.py

from django.urls import reverse_lazy
from django.views.generic import RedirectView

class MyRedirectView(RedirectView):
    url = reverse_lazy('book_list') # URL을 지연시켜 동적으로 생성

References