✅ Django 검색 뷰 함수 완전 분석: search() 함수 흐름 이해하기

2025. 5. 16. 15:12·기술블로그-Django편

✅ 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

🔄 실행 흐름

  1. search_type = 'user'
  2. q = 'cha'
  3. User.objects.filter(nickname__icontains='cha') 실행
  4. 결과 리스트를 템플릿으로 렌더링

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
'기술블로그-Django편' 카테고리의 다른 글
  • 📌 Django ImageField 완전 정리 - 이미지 업로드 기능 구현 가이드
  • ✅ Django ORM 필드 룩업 완전 정복: nickname__icontains vs tags__tag 차이 이해하기
  • ✅ Django symmetrical 옵션 완전 이해하기
  • ✅ Django QuerySet의 논리 평가와 get_context_data 코드 완전 이해하기
Chansman
Chansman
안녕하세요! 코딩을 시작한 지 얼마 되지 않은 초보 개발자 찬스맨입니다. 이 블로그는 제 학습 기록을 남기고, 다양한 코딩 실습을 통해 성장하는 과정을 공유하려고 합니다. 초보자의 눈높이에 맞춘 실습과 팁, 그리고 개발하면서 겪은 어려움과 해결 과정을 솔직하게 풀어내려 합니다. 함께 성장하는 개발자 커뮤니티가 되기를 바랍니다.
  • Chansman
    찬스맨의 프로그래밍 스토리
    Chansman
  • 전체
    오늘
    어제
    • 분류 전체보기 (798)
      • Python (32)
      • 프로젝트 (113)
      • 과제 (25)
      • Database (40)
      • 멘토링 (11)
      • 특강 (37)
      • 기술블로그 (41)
      • 기술블로그-Fastapi편 (33)
      • 기술블로그-Django편 (154)
      • 기술블로그-Flask편 (36)
      • AI 분석 (5)
      • HTML & CSS (31)
      • JavaScript (17)
      • AWS_Cloud (21)
      • 웹스크래핑과 데이터 수집 (14)
      • Flask (42)
      • Django (77)
      • Fastapi (16)
      • 연예 (14)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    lawsuitculture
    btsjungkook
    bts
    chatgpterror
    뷔
    americaparty
    youngprofessionals
    remittance
    gpterror
    travel ban
    hotcoffeecase
    basalcellcarcinoma
    newpoliticalparty
    college reunions
    livebroadcast
    homebartrend
    urbantrends
    smartphonedurability
    btsdischarge
    classaction
    life reflection
    self-growth
    titaniumcase
    btsreunion
    americanlaw
    chinanightlife
    RM
    btscomeback
    trumpmuskclash
    global politics
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Chansman
✅ Django 검색 뷰 함수 완전 분석: search() 함수 흐름 이해하기
상단으로

티스토리툴바