[장고] 리스트 뷰: 개념부터 사용법, 커스터마이징까지

소요 시간: 3분

장고(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

주요 개념 및 속성

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">&laquo; 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 &raquo;</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 애플리케이션 개발에 있어 반복적인 작업을 줄이고, 코드의 간결성과 유지보수성을 높일 수 있습니다.

장고 리스트