Django

Chapter 4-6 Django 블로그 검색 기능 구현하기

Chansman 2025. 5. 7. 10:38

🔍 블로그 검색 기능 구현하기

사용자가 작성한 블로그 글 중 제목 또는 본문에 특정 키워드가 포함된 글을 검색할 수 있는 기능입니다. 페이지네이션과 함께 작동하여, 검색 결과가 여러 페이지에 걸쳐 있을 경우에도 검색어가 유지되도록 구성합니다.


1️⃣ 검색 폼 추가 (blog_list.html)

<!-- blog_list.html 상단 -->
<form method="get" style="margin-bottom: 10px;">
    <input name="q" type="text" placeholder="검색어를 입력하세요." value="{{ request.GET.q }}">
    <button>검색</button>
</form>

📌 name="q"인 input 필드를 통해 검색어를 GET 방식으로 전달
📌 value="{{ request.GET.q }}를 설정하여 검색어가 유지되도록 처리


2️⃣ 검색 로직 구현 (views.py)

from django.db.models import Q
from django.core.paginator import Paginator

def blog_list(request):
    blogs = Blog.objects.all().order_by('-created_at')

    # 🔍 검색어 필터링
    q = request.GET.get('q')
    if q:
        blogs = blogs.filter(
            Q(title__icontains=q) |
            Q(content__icontains=q)
        )

    paginator = Paginator(blogs, 10)
    page = request.GET.get('page')
    page_object = paginator.get_page(page)

    context = {
        'page_object': page_object
    }
    return render(request, 'blog_list.html', context)

📌 icontains를 사용하여 대소문자 구분 없이 검색
📌 Q() 객체로 제목과 본문 모두 조건에 포함


3️⃣ 검색어를 페이지네이션에 유지하기

<a href="?page=1{% if request.GET.q %}&q={{ request.GET.q }}{% endif %}">&laquo; 첫번째</a>
<a href="?page={{ page_object.previous_page_number }}{% if request.GET.q %}&q={{ request.GET.q }}{% endif %}">이전</a>

...

<a href="?page={{ i }}{% if request.GET.q %}&q={{ request.GET.q }}{% endif %}">{{ i }}</a>

...

<a href="?page={{ page_object.next_page_number }}{% if request.GET.q %}&q={{ request.GET.q }}{% endif %}">다음</a>
<a href="?page={{ page_object.paginator.num_pages }}{% if request.GET.q %}&q={{ request.GET.q }}{% endif %}">마지막 &raquo;</a>

📌 검색 후 페이지를 넘겨도 검색어가 유지되어야 하므로 &q=검색어를 URL에 계속 포함시킴


✅ 요약 체크리스트

항목 구현 여부

검색 대상 ✅ 제목과 본문 모두 포함 (Q 객체)
검색 입력창 ✅ GET 방식 입력 폼 구성
검색어 유지 ✅ 입력창 value, URL 파라미터로 유지
페이지 이동 시 검색 유지 ✅ 쿼리스트링에 &q=검색어 포함

💬 검색은 사용자가 원하는 정보를 빠르게 찾기 위한 핵심 기능입니다. Django의 Q 객체와 GET 파라미터 조합을 통해 간단하면서도 유연하게 구현할 수 있어요!