본문 바로가기
Python

Django 마이페이지에 검색 & 필터 기능 추가하기 (날짜, 키워드, 감성 기준)

by ramzee 2025. 4. 18.

0. 이 글은 누구를 위한 글인가요?

  • 내가 분석한 기록 중에서 특정 키워드나 날짜에 해당하는 결과만 보고 싶으신 분
  • 마이페이지에 필터 기능을 넣어 히스토리를 정리하고 싶으신 분
  • Django에서 검색 폼 + 필터 처리를 구현해보고 싶은 분

1. 실습 목표

기능 설명
검색 필터 키워드 포함 제목 검색
감성 필터 긍정, 부정, 중립 필터링
날짜 필터 시작일 ~ 종료일 설정 가능
필터 조합 세 가지 조건을 함께 적용 가능

2. 기존 마이페이지 뷰 복습


@login_required
def mypage(request):
    user_results = AnalysisResult.objects.filter(user=request.user).order_by('-analyzed_at')
    return render(request, 'analyzer/mypage.html', {'results': user_results})

3. views.py 수정 – 필터링 기능 추가


from django.utils.dateparse import parse_date

@login_required
def mypage(request):
    keyword = request.GET.get('keyword', '')
    sentiment = request.GET.get('sentiment', '')
    start_date = request.GET.get('start_date', '')
    end_date = request.GET.get('end_date', '')

    results = AnalysisResult.objects.filter(user=request.user)

    if keyword:
        results = results.filter(title__icontains=keyword)
    if sentiment:
        results = results.filter(sentiment=sentiment)
    if start_date:
        results = results.filter(analyzed_at__date__gte=parse_date(start_date))
    if end_date:
        results = results.filter(analyzed_at__date__lte=parse_date(end_date))

    results = results.order_by('-analyzed_at')

    context = {
        'results': results,
        'keyword': keyword,
        'sentiment': sentiment,
        'start_date': start_date,
        'end_date': end_date,
    }
    return render(request, 'analyzer/mypage.html', context)

4. 템플릿 수정 – 검색 폼 추가

<form method="get">
  키워드: <input type="text" name="keyword" value="{{ keyword }}">
  감성:
  <select name="sentiment">
    <option value="">전체</option>
    <option value="긍정" {% if sentiment == '긍정' %}selected{% endif %}>긍정</option>
    <option value="부정" {% if sentiment == '부정' %}selected{% endif %}>부정</option>
    <option value="중립" {% if sentiment == '중립' %}selected{% endif %}>중립</option>
  </select>
  시작일: <input type="date" name="start_date" value="{{ start_date }}">
  종료일: <input type="date" name="end_date" value="{{ end_date }}">
  <button type="submit">검색</button>
</form>
결과 테이블

<table border="1">
  <tr>
    <th>분석일</th>
    <th>키워드</th>
    <th>제목</th>
    <th>감성</th>
    <th>요약</th>
  </tr>
  {% for r in results %}
  <tr>
    <td>{{ r.analyzed_at|date:"Y-m-d H:i" }}</td>
    <td>{{ r.keyword }}</td>
    <td>{{ r.title }}</td>
    <td>{{ r.sentiment }}</td>
    <td>{{ r.summary }}</td>
  </tr>
  {% empty %}
  <tr><td colspan="5">조회된 결과가 없습니다.</td></tr>
  {% endfor %}
</table>

5. 예시 시나리오

  • 키워드: 미래, 감성: 긍정 → “미래” 포함 + 긍정 결과만 출력
  • 키워드: 기술, 시작일: 2025-03-01, 종료일: 2025-03-15 → 조건 내 결과만 출력

6. 동작 흐름 요약

[GET /mypage?keyword=...&sentiment=...&start_date=...] 
    ↓
[views.mypage] → QuerySet 필터링 수행
    ↓
[mypage.html] → 검색값 유지 + 결과 출력

7. 마무리 요약

기능 설명
키워드 검색 title__icontains 필터
감성 필터 sentiment 정확히 일치
날짜 필터 __date__gte / lte
값 유지 템플릿에서 value="{{ 변수 }}"