[장고] 상세 페이지 하단에 관련 글 리스트 추가하기
Django로 블로그를 운영하면서 사용자 경험을 향상시키기 위해 관련 글을 표시하는 기능을 추가하는 방법을 알아보겠습니다. 이 기능은 사용자가 한 글을 읽은 후 비슷한 주제의 다른 글로 자연스럽게 이동할 수 있도록 도와줍니다. 이 튜토리얼에서는 모델 설정, 뷰 함수 작성, 템플릿 작성, 그리고 URL 설정 순서로 관련 글을 표시하는 기능을 구현해보겠습니다.
1. 모델 설정
먼저, 관련 글을 필터링하기 위해 태그를 사용할 것입니다. 이를 위해 Post 모델에 태그를 추가하고, 태그를 관리할 Tag 모델을 별도로 만듭니다.
models.py 파일을 열고 다음과 같이 수정합니다:
from django.db import models
class Tag(models.Model):
name = models.CharField(max_length=50)
def __str__(self):
return self.name
class Post(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
tags = models.ManyToManyField(Tag, related_name='posts')
created_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.title
코드 설명:
- Tag 모델은 태그 이름을 저장합니다.
- Post 모델은 제목, 내용, 생성 시간, 그리고 여러 태그와의 다대다 관계를 정의합니다.
- ManyToManyField를 사용하여 한 글이 여러 태그를 가질 수 있게 합니다.
2. 뷰 함수 작성
이제 상세 페이지에서 관련 글을 필터링하여 보여주기 위한 뷰 함수를 작성합니다.
views.py 파일에 다음 코드를 추가합니다:
from django.shortcuts import render, get_object_or_404
from .models import Post
def post_detail(request, post_id):
post = get_object_or_404(Post, id=post_id)
related_posts = Post.objects.filter(tags__in=post.tags.all()).exclude(id=post.id).distinct()
return render(request, 'post_detail.html', {'post': post, 'related_posts': related_posts})
코드 설명:
- get_object_or_404를 사용하여 요청된 글을 가져옵니다.
- 현재 글과 같은 태그를 가진 다른 글들을 필터링합니다.
- 현재 글은 제외하고, 중복을 제거한 후 관련 글 목록을 템플릿에 전달합니다.
3. 템플릿 작성
이제 관련 글을 표시할 템플릿을 작성합니다.
post_detail.html 파일을 생성하고 다음과 같이 작성합니다:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{{ post.title }}</title>
</head>
<body>
<h1>{{ post.title }}</h1>
<p>{{ post.content }}</p>
<h2>Related Posts</h2>
<ul>
{% for related_post in related_posts %}
<li><a href="{% url 'post_detail' related_post.id %}">{{ related_post.title }}</a></li>
{% empty %}
<li>No related posts found.</li>
{% endfor %}
</ul>
</body>
</html>
코드설명:
- 현재 글의 제목과 내용을 표시합니다.
- 관련 글 목록을 링크 형태로 보여줍니다.
- 관련 글이 없을 경우 "No related posts found." 메시지를 표시합니다.
4. URL 설정
마지막으로, 상세 페이지 URL 설정을 추가합니다.
urls.py 파일을 열고 다음과 같이 수정합니다:
from django.urls import path
from . import views
urlpatterns = [
path('post/<int:post_id>/', views.post_detail, name='post_detail'),
]
코드 설명:
- post_detail 뷰가 /post/<post_id>/ 경로에서 호출될 수 있도록 설정합니다.
- <int:post_id>는 URL에서 정수형의 post_id를 추출하여 뷰에 전달합니다.
5. 마무리 및 테스트
모든 설정이 완료되었습니다. 이제 서버를 실행하고 블로그 글의 상세 페이지에서 관련 글이 잘 표시되는지 테스트해보겠습니다.
터미널에서 다음 명령어를 실행하세요:
python manage.py runserver
웹 브라우저에서 http://127.0.0.1:8000/post/1/ 같은 URL을 열어, 해당 글의 상세 페이지에서 관련 글이 잘 표시되는지 확인합니다.
결론
이번 포스트에서는 Django를 사용하여 블로그 상세 페이지에서 관련 글을 표시하는 기능을 구현해보았습니다. 이 기능을 통해 방문자들이 더 많은 글을 쉽게 찾을 수 있게 되어, 블로그의 방문 시간을 늘릴 수 있습니다. Django의 강력한 ORM과 템플릿 기능을 활용하여 효율적으로 관련 글을 필터링하고 표시할 수 있었습니다.