장고 블로그 앱: 게시글 상세 페이지
Django로 블로그 게시글의 상세 페이지를 만드는 과정을 단계별로 설명한다. 이 튜토리얼에서는 모델 정의, 뷰 구현, 그리고 템플릿 작성을 통해 게시글의 상세 페이지를 만든다. 추가적으로, 게시글 공개 여부를 확인하고 특별한 메시지를 표시하는 기능도 구현할 것이다.
1. 모델 정의 (Model Definition)
첫 번째로 데이터베이스 모델을 정의한다. Django에서는 모델을 사용해 데이터베이스 구조를 쉽게 설계할 수 있다. 이번 예제에서는 Article 모델을 만들어 블로그 게시글 데이터를 관리한다.
모델 작성
models.py에서 Article 모델을 정의한다. 이 모델은 제목, 내용, 발행일, 공개 여부 필드를 포함하고 있다.
# models.py
from django.db import models
class Article(models.Model):
title = models.CharField(max_length=100) # 게시글 제목
content = models.TextField() # 게시글 내용
published_at = models.DateTimeField() # 게시글 발행일
is_public = models.BooleanField(default=True) # 게시글 공개 여부
- title: 최대 100자까지 입력 가능한 게시글 제목이다.
- content: 게시글 내용을 저장하는 필드이다.
- published_at: 게시글의 발행 일시를 나타내는 필드이다.
- is_public: 게시글이 공개 상태인지 여부를 나타낸다. 기본값은 True이다.
모델 정의가 끝나면, 마이그레이션을 수행하여 데이터베이스에 반영한다.
python manage.py makemigrations
python manage.py migrate
2. 뷰 정의 (View Definition)
Django에서는 views.py 파일에서 사용자의 요청을 처리하고 데이터를 템플릿에 전달한다. 이번에는 Article 모델을 활용해 상세 페이지를 표시하는 뷰를 작성한다.
DetailView 활용
Django의 DetailView는 특정 모델의 상세 데이터를 손쉽게 처리할 수 있도록 도와준다. ArticleDetailView를 작성해 Article 모델의 상세 정보를 표시하도록 한다.
# views.py
from django.views.generic.detail import DetailView
from django.http import Http404
from .models import Article
class ArticleDetailView(DetailView):
model = Article # 사용할 모델
template_name = 'article_detail.html' # 사용할 템플릿 파일
def get_object(self, queryset=None):
obj = super().get_object(queryset) # 기본 객체 가져오기
if not obj.is_public: # 비공개된 경우
raise Http404("비공개된 기사다.")
return obj
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['extra_message'] = '이 기사는 특별하다.' # 추가 메시지 전달
return context
- model: 뷰에서 사용할 모델을 지정한다. 여기서는 Article이다.
- template_name: 뷰에서 사용할 템플릿을 지정한다.
- get_object: 데이터베이스에서 객체를 가져오는 메서드로, 게시글이 비공개 상태일 때 404 에러를 발생시킨다.
- get_context_data: 템플릿에 추가로 전달할 데이터를 설정한다. 이 예제에서는 extra_message라는 메시지를 템플릿에 전달한다.
URL 설정
urls.py 파일에서 ArticleDetailView를 URL에 연결한다.
# urls.py
from django.urls import path
from .views import ArticleDetailView
urlpatterns = [
path('article/<int:pk>/', ArticleDetailView.as_view(), name='article_detail'),
]
- path('article/<int:pk>/'): 게시글 ID(pk)를 기반으로 상세 페이지를 표시한다.
3. 템플릿 작성 (Template)
Django의 템플릿 시스템을 이용해 HTML 페이지를 작성한다. 템플릿은 사용자가 보게 될 상세 페이지를 구성한다.
templates/article_detail.html 파일을 작성한다.
<!-- templates/article_detail.html --> <!DOCTYPE html> <html lang="ko"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>{{ object.title }}</title> <!-- 게시글 제목 --> </head> <body> <h1>{{ object.title }}</h1> <!-- 게시글 제목 --> <p>{{ object.content }}</p> <!-- 게시글 내용 --> <p>추가 메시지: {{ extra_message }}</p> <!-- 추가 메시지 --> </body> </html>
- {{ object.title }}: Article 모델에서 가져온 제목을 출력한다.
- {{ object.content }}: Article 모델에서 가져온 내용을 출력한다.
- {{ extra_message }}: 뷰에서 전달된 추가 메시지를 출력한다.
결론
Django를 사용해 블로그 게시글의 상세 페이지를 만드는 과정을 설명했다. 모델 정의, 뷰 작성, 템플릿 작성을 통해 간단한 페이지를 만들 수 있었다. 이처럼 Django를 활용하면 웹 애플리케이션의 기능을 빠르고 쉽게 구현할 수 있다.