✅ Django 검색 뷰 함수 완전 분석: search() 함수 흐름 이해하기
1. 🎯 목적
사용자가 입력한 검색어(q)와 검색 대상(type)에 따라
- 사용자 닉네임을 검색하거나,
- 태그가 포함된 게시글을 검색해서
결과를 해당 템플릿에 렌더링하는 뷰 함수입니다.
2. 🔍 전체 코드 구조
def search(request):
search_type = request.GET.get('type') # 'user' 또는 'tag'
q = request.GET.get('q', '') # 검색어 (없으면 기본값 '')
if search_type in ['user', 'tag'] and q:
if search_type == 'user':
object_list = User.objects.filter(nickname__icontains=q)
else:
object_list = Post.objects.filter(tags__tag=q)
context = {
'object_list': object_list
}
return render(request, f'search/search_{search_type}.html', context)
return render(request, 'search/search.html')
3. 🧩 상세 설명 (라인별 해설)
✅ 쿼리 파라미터 가져오기
search_type = request.GET.get('type') # 예: ?type=user
q = request.GET.get('q', '') # 예: ?q=alice
- HTML 폼에서 전송된 GET 요청의 파라미터를 가져옴
- q는 검색어, type은 검색 대상 (user 또는 tag)
✅ 유효성 검사 및 조건 분기
if search_type in ['user', 'tag'] and q:
- type이 'user' 또는 'tag' 중 하나인지 확인
- q (검색어)가 비어있지 않은지도 확인
✅ 실제 검색 처리
🔎 사용자 검색 (닉네임 포함 여부)
User.objects.filter(nickname__icontains=q)
- 닉네임에 q가 포함된 User만 검색
- 대소문자 구분 없이 부분 일치 검색 가능
🔎 태그 검색
Post.objects.filter(tags__tag=q)
- Post 모델의 ManyToManyField로 연결된 Tag 중, tag 값이 정확히 일치하는 경우만 검색
✅ 검색 결과 렌더링
context = {'object_list': object_list}
return render(request, f'search/search_{search_type}.html', context)
- 검색된 결과 리스트를 템플릿에 넘김
- 검색 유형에 따라 다른 템플릿(search_user.html 또는 search_tag.html)에 렌더링
❗ 검색 조건이 없을 때 기본 템플릿 출력
return render(request, 'search/search.html')
- type이나 검색어가 없으면 그냥 빈 검색창 페이지로 돌아감
4. 💡 실제 요청 예시
📍 URL 예시
/search/?type=user&q=cha
🔄 실행 흐름
- search_type = 'user'
- q = 'cha'
- User.objects.filter(nickname__icontains='cha') 실행
- 결과 리스트를 템플릿으로 렌더링
5. 🧠 정리 요약
항목 설명
request.GET.get('q') | HTML 폼에서 전송된 검색어 |
request.GET.get('type') | 검색 대상 (user or tag) |
icontains | 대소문자 무시 부분 검색 |
tags__tag | ManyToManyField 관계 역참조 검색 |
템플릿 분기 | /search/search_user.html, /search/search_tag.html |
필요하시면 이 뷰에 연결되는 HTML <form> 예제나 템플릿 구조도 정리해드릴게요 😊
'기술블로그-Django편' 카테고리의 다른 글
📌 Django ImageField 완전 정리 - 이미지 업로드 기능 구현 가이드 (0) | 2025.05.16 |
---|---|
✅ Django ORM 필드 룩업 완전 정복: nickname__icontains vs tags__tag 차이 이해하기 (0) | 2025.05.16 |
✅ Django symmetrical 옵션 완전 이해하기 (0) | 2025.05.16 |
✅ Django QuerySet의 논리 평가와 get_context_data 코드 완전 이해하기 (0) | 2025.05.16 |
📌 Django ORM - get_or_create 완전 정복 (0) | 2025.05.16 |