티스토리 뷰
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 애플리케이션을 더욱 효율적으로 개발할 수 있습니다!
'Python > Django Framework (DRF)' 카테고리의 다른 글
| Django의 믹스인(Mixin) 클래스 (0) | 2025.03.09 |
|---|---|
| Django의 as_view()는 왜 필요한가? (0) | 2025.03.09 |
| [Django] Python 매직 메서드(Magic Methods) 완벽정리 (0) | 2025.03.09 |
| Django ORM의 특성과 깊이 있는 이해 (1) | 2025.03.09 |
| Django의 정적 파일이 정상적으로 동작하지 않는 경우 확인할 것 (0) | 2025.02.25 |
- Total
- Today
- Yesterday
- 토치비전
- Numpy
- 클래스형 뷰
- 오블완
- chat gpt 모델 api 가격 예측
- chat gpt 모델 별 가격
- 기술적분석
- 차트분석
- 로또 1164회 당첨
- 주식투자
- 재테크
- 주식공부
- 인공지능 로또 예측
- 퀀트투자
- 케라스
- 1164회 로또
- chat gpt 4o 예산
- chat gpt api 비용 계산
- 장고 orm sql문 비교
- chat gpt 모델별 예산
- 로또 ai
- 자동매매로직
- 주린이탈출
- Python
- 골든크로스
- 티스토리챌린지
- 1165회 로또
- chat gpt 가격 예상
- 자동매매
- chat gpt 한국어 가격
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |