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="{{ 변수 }}" |