티스토리 뷰

728x90
반응형

Django에서 뷰(View)를 작성할 때, 기본적인 로직이 반복되는 경우가 많습니다. 예를 들어, 데이터베이스에서 특정 모델을 조회하여 출력하는 기능은 다양한 페이지에서 필요합니다. Django는 이러한 반복적인 작업을 줄이기 위해 제네릭 뷰(Generic View) 를 제공합니다.

이 글에서는 Django의 Generic View가 무엇인지, 어떤 기능을 제공하는지, 그리고 실제 예제를 통해 사용하는 방법을 알아보겠습니다.


1. Generic View란?

Generic View는 Django에서 제공하는 클래스형 뷰(Class-Based View, CBV)의 확장된 형태로, 웹 애플리케이션에서 자주 사용하는 패턴을 쉽게 구현할 수 있도록 미리 정의된 뷰 클래스입니다.

Django의 Generic View는 기본적인 CRUD(Create, Read, Update, Delete) 기능을 구현하는 데 유용하며, 개발자가 반복적인 코드를 줄이고 유지보수를 쉽게 할 수 있도록 도와줍니다.

  • 코드 재사용성: 중복 코드를 줄이고 공통 로직을 상속하여 재사용할 수 있습니다.
  • 구조화된 코드: 함수형 뷰보다 명확하게 역할이 나뉘어 있어 유지보수가 편리합니다.
  • 기본 제공 기능 활용: Django가 제공하는 다양한 Generic View 를 활용하여 적은 코드로 CRUD 기능을 구현할 수 있습니다.

2. 자주 사용되는 Generic View의 종류

Django에서는 여러 종류의 클래스형 뷰를 제공합니다. 대표적인 CBV는 다음과 같습니다:

 

Generic View 이름 역할
ListView 특정 모델의 목록을 보여줍니다.
DetailView 특정 객체의 상세 정보를 보여줍니다.
CreateView 새로운 객체를 생성하는 폼을 제공합니다.
UpdateView 기존 객체를 수정하는 폼을 제공합니다.
DeleteView 특정 객체를 삭제하는 기능을 제공합니다.
TemplateView 특정 템플릿을 렌더링하여 반환
RedirectView 특정 URL로 리다이렉션

3. Generic View 사용 예제

3.1. 모델 정의

우선, Book이라는 간단한 모델을 정의해보겠습니다.

from django.db import models

class Book(models.Model):
    title = models.CharField(max_length=200)
    author = models.CharField(max_length=100)
    published_date = models.DateField()

    def __str__(self):
        return self.title

3.2. ListView 사용하기

모든 Book 객체를 리스트 형태로 출력하는 뷰를 ListView를 사용하여 구현할 수 있습니다.

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

class BookListView(ListView):
    model = Book
    template_name = 'book_list.html'  # 사용할 템플릿 파일
    context_object_name = 'books'  # 템플릿에서 사용할 변수명

URL 설정

from django.urls import path
from .views import BookListView

urlpatterns = [
    path('books/', BookListView.as_view(), name='book_list'),
]

템플릿 예제 (book_list.html)

<h1>Book List</h1>
<ul>
    {% for book in books %}
        <li>{{ book.title }} by {{ book.author }} ({{ book.published_date }})</li>
    {% endfor %}
</ul>

3.3. DetailView 사용하기

특정 Book 객체의 상세 정보를 보여주는 DetailView를 구현해보겠습니다.

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

class BookDetailView(DetailView):
    model = Book
    template_name = 'book_detail.html'  # 사용할 템플릿 파일

URL 설정

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

템플릿 예제 (book_detail.html)

<h1>{{ book.title }}</h1>
<p>Author: {{ book.author }}</p>
<p>Published Date: {{ book.published_date }}</p>
<a href="{% url 'book_list' %}">Back to List</a>

3.4. CreateView 사용하기

새로운 Book 객체를 추가하는 CreateView를 사용해보겠습니다.

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

class BookCreateView(CreateView):
    model = Book
    fields = ['title', 'author', 'published_date']
    template_name = 'book_form.html'
    success_url = reverse_lazy('book_list')  # 생성 후 이동할 페이지

URL 설정

urlpatterns += [
    path('books/add/', BookCreateView.as_view(), name='book_add'),
]

템플릿 예제 (book_form.html)

<h1>Add a New Book</h1>
<form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">Save</button>
</form>

3.5. UpdateView 사용하기

기존 Book 객체를 수정하는 UpdateView도 쉽게 구현할 수 있습니다.

from django.views.generic.edit import UpdateView

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

URL 설정

urlpatterns += [
    path('books/<int:pk>/edit/', BookUpdateView.as_view(), name='book_edit'),
]

3.6. DeleteView 사용하기

마지막으로, Book 객체를 삭제하는 DeleteView를 구현해보겠습니다.

from django.views.generic.edit import DeleteView

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

URL 설정

urlpatterns += [
    path('books/<int:pk>/delete/', BookDeleteView.as_view(), name='book_delete'),
]

템플릿 예제 (book_confirm_delete.html)

<h1>Are you sure you want to delete {{ book.title }}?</h1>
<form method="post">
    {% csrf_token %}
    <button type="submit">Yes, Delete</button>
</form>
<a href="{% url 'book_list' %}">Cancel</a>

 

3.7. TemplateView 사용하기

TemplateView는 특정 HTML 페이지를 렌더링하는 데 사용됩니다.

from django.views.generic import TemplateView

class HomePageView(TemplateView):
    template_name = 'home.html'

URL 설정

urlpatterns += [
    path('', HomePageView.as_view(), name='home'),
]

3.8. RedirectView 사용하기

특정 URL로 이동해야 하는 경우 RedirectView를 사용할 수 있습니다.

from django.views.generic import RedirectView

class GoToGoogleView(RedirectView):
    url = 'https://www.google.com'

URL 설정

urlpatterns += [
    path('google/', GoToGoogleView.as_view(), name='go_to_google'),
]

 

4. 결론

Django의 Generic View는 자주 사용되는 패턴을 쉽게 구현할 수 있도록 미리 정의된 뷰 클래스입니다.

  • ListView, DetailView를 사용하면 객체를 쉽게 조회할 수 있습니다.
  • CreateView, UpdateView, DeleteView를 사용하면 CRUD 기능을 간단히 구현할 수 있습니다.
  • TemplateView를 사용하면 정적인 페이지를 쉽게 렌더링할 수 있습니다.
  • RedirectView를 사용하면 특정 URL로의 이동을 쉽게 구현할 수 있습니다.
  • success_url을 활용하면 작업이 완료된 후 이동할 페이지를 지정할 수 있습니다.

Generic View를 활용하면 Django 애플리케이션을 더욱 효율적으로 개발할 수 있습니다!

728x90
반응형