장고 DetailView 정리

소요 시간: 5분

DetailView: 상세 페이지 구현하기

DetailView는 Django의 클래스 기반 뷰로, 특정 모델 객체의 세부 정보를 표시하는 데 최적화된 뷰다. 블로그 글, 사용자 프로필, 제품 정보와 같은 "상세 보기" 페이지를 구현할 때 매우 유용하다. 이번 가이드를 통해 DetailView의 핵심 개념, 주요 속성, 커스터마이징 방법을 알아보자.


1. DetailView란?

Django DetailView는 모델의 단일 객체에 대한 상세 정보를 보여주기 위한 제네릭 클래스 기반 뷰다. 이 뷰는 Python의 상속을 활용하여, 기본적인 데이터 조회와 템플릿 렌더링 기능을 자동으로 처리한다.

DetailView를 상속받은 클래스에서는 최소한의 코드로 세부 페이지를 구현할 수 있으며, 필요한 경우 메서드를 오버라이드하거나 속성을 설정해 추가적인 기능을 구현할 수 있다.


2. DetailView의 주요 구성 요소

2.1 model 속성

조회할 모델을 지정한다. 예를 들어, Article 모델의 객체를 보여주고 싶다면 model 속성을 설정한다.

# views.py
from django.views.generic.detail import DetailView
from .models import Article

class ArticleDetailView(DetailView):
    model = Article

이제 ArticleDetailView는 Article 모델 객체의 상세 페이지를 처리한다.

2.2 URL 매핑

URL 패턴에 pk나 slug를 포함해 객체를 식별한다.

# urls.py
from django.urls import path
from .views import ArticleDetailView

urlpatterns = [
    path('article/<int:pk>/', ArticleDetailView.as_view(), name='article-detail'),
]

/article/1/ 같은 URL이 들어오면, pk=1인 Article 객체의 세부 정보를 보여준다.

2.3 template_name 속성

기본적으로 <app_name>/<model_name>_detail.html 템플릿을 찾는다. 필요하면 template_name 속성을 사용해 변경할 수 있다.

class ArticleDetailView(DetailView):
    model = Article
    template_name = 'custom_article_detail.html'

2.4 queryset 속성

조회할 객체의 범위를 제한할 때 사용한다.

class PublishedArticleDetailView(DetailView):
    model = Article
    queryset = Article.objects.filter(status='published')

위 코드는 status='published'인 객체만 조회한다.


3. DetailView의 메서드 커스터마이징

3.1 get_object()

객체 조회 로직을 변경하고 싶다면 get_object() 메서드를 오버라이드한다.

class CustomArticleDetailView(DetailView):
    model = Article

    def get_object(self, queryset=None):
        obj = super().get_object(queryset)
        if not obj.is_public:
            raise Http404("비공개된 기사다.")
        return obj

3.2 get_context_data()

템플릿에 추가 데이터를 전달하려면 get_context_data() 메서드를 사용한다.

class ArticleDetailView(DetailView):
    model = Article

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['extra_message'] = '특별한 내용이 포함되어 있다.'
        return context


4. DetailView의 동작 과정


5. DetailView 활용 시 주의할 점


6. 결론

DetailView는 단일 객체의 세부 정보를 제공하는 데 최적화된 뷰다. 코드가 간결하고, 다양한 커스터마이징 옵션을 통해 복잡한 요구사항도 처리할 수 있다. 이 가이드를 통해 DetailView를 효과적으로 활용해보자. Django 프로젝트에서 강력한 "상세 보기" 기능을 구현할 수 있다.

장고 리스트