Django DetailView
1. DetailView란?
Django의 DetailView는 특정 객체의 상세 정보를 보여주는 클래스 기반 뷰(CBV) 입니다. ListView가 여러 개의 객체 목록을 표시하는 반면, DetailView는 하나의 객체를 가져와 템플릿에 전달합니다.
2. 기본적인 사용법
Django의 DetailView는 django.views.generic.detail.DetailView 클래스를 상속하여 사용합니다.
(1) 모델 설정
from django.db import models
class Article(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
(2) DetailView 생성
from django.views.generic.detail import DetailView
from django.shortcuts import get_object_or_404
from .models import Article
class ArticleDetailView(DetailView):
model = Article # 조회할 모델 지정
template_name = 'article_detail.html' # 사용할 템플릿 지정 (선택 사항)
context_object_name = 'article' # 템플릿에서 사용할 객체 이름 지정 (선택 사항)
(3) URL 설정
from django.urls import path
from .views import ArticleDetailView
urlpatterns = [
path('article/<int:pk>/', ArticleDetailView.as_view(), name='article_detail'),
]
(4) 템플릿 작성 (article_detail.html)
<h1>{{ article.title }}</h1>
<p>{{ article.content }}</p>
<p>작성일: {{ article.created_at }}</p>
3. DetailView에서 추가적인 데이터 제공
만약 템플릿에 추가적인 데이터를 전달하고 싶다면 get_context_data 메서드를 오버라이딩할 수 있습니다.
class ArticleDetailView(DetailView):
model = Article
template_name = 'article_detail.html'
context_object_name = 'article'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['extra_info'] = '추가 정보입니다!' # 추가 데이터를 컨텍스트에 포함
return context
4. get_object() 메서드 활용
객체를 조회하는 방식을 직접 커스텀하고 싶다면 get_object() 메서드를 오버라이딩할 수 있습니다.
class ArticleDetailView(DetailView):
model = Article
template_name = 'article_detail.html'
def get_object(self):
obj = super().get_object()
# 예를 들어, 조회수를 증가시키는 로직 추가 가능
obj.view_count += 1
obj.save()
return obj
5. 권한 및 접근 제한
만약 로그인한 사용자만 특정 객체를 볼 수 있도록 제한하고 싶다면 LoginRequiredMixin을 사용할 수 있습니다.
from django.contrib.auth.mixins import LoginRequiredMixin
class ArticleDetailView(LoginRequiredMixin, DetailView):
model = Article
template_name = 'article_detail.html'
login_url = '/accounts/login/' # 로그인 페이지 경로 지정
6. 마무리
- DetailView는 특정 객체 하나를 가져와 템플릿에서 표시하는데 유용한 CBV입니다.
- context_object_name, get_context_data(), get_object() 등을 활용하여 더욱 유연한 기능을 추가할 수 있습니다.
- LoginRequiredMixin 등을 조합하여 권한을 관리할 수도 있습니다.
🔥 오늘 배운 점 정리
✅ DetailView는 단일 객체를 조회하는 CBV이다. ✅ get_context_data()를 활용해 추가 데이터를 템플릿에 전달할 수 있다. ✅ get_object()를 오버라이딩하여 객체를 조회하는 방식을 변경할 수 있다. ✅ LoginRequiredMixin을 사용해 로그인한 사용자만 볼 수 있도록 제한할 수 있다.
'내일배움캠프 TIL' 카테고리의 다른 글
| 2025.02.05TIL - Django : PostDetail (0) | 2025.02.05 |
|---|---|
| 2025.02.04 TIL : Django - Serializer (0) | 2025.02.04 |
| 2025.01.31TIL : 클래스 복습 (0) | 2025.01.31 |
| 2025.01.27 TIL Django : URL (0) | 2025.01.27 |
| 2025.01.24TIL: LLM 기초 개념 정리 (0) | 2025.01.24 |