[장고] 리스트 뷰: 개념부터 사용법, 커스터마이징까지
장고(Django)의 리스트 뷰(ListView)는 제너릭 클래스 기반 뷰 중 하나로, 특정 모델의 객체 목록을 보여주는 데 사용됩니다. ListView는 간단한 설정만으로 목록을 표시할 수 있어, CRUD 애플리케이션 개발에 매우 유용합니다. 아래는 ListView를 사용하는 방법과 주요 개념에 대한 자세한 설명입니다.
리스트 뷰란?
장고(Django)의 리스트 뷰(ListView)는 장고에서 제공하는 제너릭 뷰 중 하나로, 데이터베이스에 저장된 객체의 목록을 표시하는 데 사용됩니다. 리스트 뷰는 일반적으로 모델의 객체 리스트를 렌더링하고, 이를 HTML 템플릿을 통해 사용자에게 보여줍니다. 다음은 장고 리스트 뷰의 주요 특징과 사용 방법입니다.
주요 특징
- 간편한 구현: 최소한의 코드로 객체 목록을 표시할 수 있습니다.
- 페이징 지원: 페이지네이션 기능을 기본적으로 제공합니다.
- 필터링 및 정렬: 쿼리셋을 통해 원하는 방식으로 데이터를 필터링하고 정렬할 수 있습니다.
- 템플릿 사용: 템플릿을 통해 유연하게 화면을 디자인할 수 있습니다.
ListView 사용하기
1. 모델 정의
우선, ListView에서 사용할 모델을 정의합니다. 예를 들어, 도서 정보를 저장하는 Book 모델이 있다고 가정해보겠습니다.
# models.py
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
주요 개념 및 속성
- model: 목록을 표시할 모델을 지정합니다.
- template_name: 사용할 템플릿 파일을 지정합니다. 지정하지 않으면 <app_label>/<model_name>_list.html 형태의 템플릿을 찾습니다.
- context_object_name: 템플릿에서 사용할 객체 리스트의 이름을 지정합니다. 기본값은 object_list입니다.
- paginate_by: 페이지네이션을 위해 페이지당 항목 수를 지정합니다.
- queryset: 기본 쿼리셋을 재정의할 수 있습니다.
- ordering: 정렬 기준을 지정합니다.
2. ListView 설정
이제 Book 모델의 목록을 표시하기 위해 ListView를 설정합니다.
# views.py
from django.views.generic import ListView
from .models import Book
class BookListView(ListView):
model = Book
template_name = 'books/book_list.html'
context_object_name = 'books'
paginate_by = 10 # 페이지당 항목 수
3. URL 설정
ListView를 URL에 매핑합니다.
# urls.py
from django.urls import path
from .views import BookListView
urlpatterns = [
path('books/', BookListView.as_view(), name='book-list'),
]
4. 템플릿 작성
BookListView에서 사용할 템플릿을 작성합니다.
<!DOCTYPE html>
<html>
<head>
<title>Book List</title>
</head>
<body>
<h1>Book List</h1>
<ul>
{% for book in books %}
<li>{{ book.title }} by {{ book.author }} ({{ book.published_date }})</li>
{% endfor %}
</ul>
<div class="pagination">
<span class="step-links">
{% if books.has_previous %}
<a href="?page=1">« first</a>
<a href="?page={{ books.previous_page_number }}">previous</a>
{% endif %}
<span class="current">
Page {{ books.number }} of {{ books.paginator.num_pages }}.
</span>
{% if books.has_next %}
<a href="?page={{ books.next_page_number }}">next</a>
<a href="?page={{ books.paginator.num_pages }}">last »</a>
{% endif %}
</span>
</div>
</body>
</html>
커스터마이징
사용자에 맞춰 커스터마이징이 가능합니다.
쿼리셋 커스터마이징
기본 쿼리셋을 재정의하려면 get_queryset 메서드를 오버라이드합니다.
# views.py
class BookListView(ListView):
model = Book
template_name = 'books/book_list.html'
context_object_name = 'books'
paginate_by = 10
def get_queryset(self):
return Book.objects.filter(author='Specific Author')
추가 컨텍스트 데이터 전달
추가 데이터를 템플릿에 전달하려면 get_context_data 메서드를 오버라이드합니다.
# views.py
class BookListView(ListView):
model = Book
template_name = 'books/book_list.html'
context_object_name = 'books'
paginate_by = 10
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['extra_data'] = 'Additional context data'
return context
이와 같이, Django의 ListView는 기본 설정만으로도 강력한 기능을 제공하며, 필요에 따라 쉽게 커스터마이징할 수 있습니다.
결론
장고의 ListView는 제너릭 클래스 기반 뷰 중 하나로, 특정 모델의 객체 목록을 간편하게 표시하는 기능을 제공합니다. ListView를 사용하면 최소한의 설정으로 목록을 렌더링할 수 있으며, 페이지네이션과 템플릿 설정 등의 기능을 손쉽게 구현할 수 있습니다. 또한, get_queryset과 get_context_data 메서드를 오버라이드하여 쿼리셋 및 추가 컨텍스트 데이터를 커스터마이징할 수 있습니다.
결론적으로, Django의 ListView는 효율적이고 강력한 목록 표시 기능을 제공하여, 웹 애플리케이션 개발을 보다 빠르고 쉽게 만들어 줍니다. 이를 활용하면 CRUD 애플리케이션 개발에 있어 반복적인 작업을 줄이고, 코드의 간결성과 유지보수성을 높일 수 있습니다.