[장고] 상세 페이지 하단에 관련 글 리스트 추가하기

소요 시간: 5분

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

코드 설명:


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})

코드 설명:


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>

코드설명:


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'),
]

코드 설명:


5. 마무리 및 테스트

모든 설정이 완료되었습니다. 이제 서버를 실행하고 블로그 글의 상세 페이지에서 관련 글이 잘 표시되는지 테스트해보겠습니다.

터미널에서 다음 명령어를 실행하세요:

python manage.py runserver

웹 브라우저에서 http://127.0.0.1:8000/post/1/ 같은 URL을 열어, 해당 글의 상세 페이지에서 관련 글이 잘 표시되는지 확인합니다.


결론

이번 포스트에서는 Django를 사용하여 블로그 상세 페이지에서 관련 글을 표시하는 기능을 구현해보았습니다. 이 기능을 통해 방문자들이 더 많은 글을 쉽게 찾을 수 있게 되어, 블로그의 방문 시간을 늘릴 수 있습니다. Django의 강력한 ORM과 템플릿 기능을 활용하여 효율적으로 관련 글을 필터링하고 표시할 수 있었습니다.

장고 리스트