본문 바로가기

Python/Django

[Django ORM] Django QuerySet으로 간단한 검색 기능 구현하기

참고

Django Documentation | QuerySet API reference

Django Documentation | Making queries

Django Documentation | Search

Stackoverflow - Default value of request.GET.get()

초보몽키의 개발공부로그- Queryset을 활용한 아주 간단한 필터검색 구현

실습 저장소

https://github.com/JisunParkRea/djangotube_tutorial

 

JisunParkRea/djangotube_tutorial

Simple video service which can upload youtube videos using django - JisunParkRea/djangotube_tutorial

github.com


구현하고자 하는 기능

  • 검색 단어를 포함한 video title 링크를 보여준다.
  • 기존의 video_list view를 조금만 바꿔서 구현해보자

views.py

  • __icontains: 대소문자 구분 없이 해당 단어를 포함 (SELECT ... WHERE title ILIKE '%search_key%';)
    • 주의할 점! SQLite는 contains(대소문자 구분)도 icontains와 같이 동작함(대소문자 구분 지원X)

 

def video_list(request):
    video_list = Video.objects.all()
    
    search_key = request.GET.get('search_key') # 검색어 가져오기
    if search_key: # 만약 검색어가 존재하면
        video_list = video_list.filter(title__icontains=search_key) # 해당 검색어를 포함한 queryset 가져오기

    return render(request, 'video/video_list.html', {'video_list':video_list})

template(video_list.html)

  • <form action="" method='GET'> ... </form>
  • <input type="text" name="search_key" value="{{ search_key }}">
<-- ...생략 -->

<form action="" method='GET'>
    <div class="row" style="margin-bottom:15px;">
        <div class="col-lg-5">
            <div class="input-group">
                <input type="text" class="form-control" name="search_key" value="{{ search_key }}"
                    placeholder="looking for...">
                <span class="input-group-btn">
                    <input class="btn btn-default" type="submit" value="Search">
                </span>
            </div><!-- /input-group -->
        </div><!-- /.col-lg-6 -->
    </div><!-- /.row -->
</form>

<div class="row">
    <div id="video_list_search" class="col-md-12">
        {% for video in video_list %}
        <a href="/video/{{ video.id }}">
            <h4>{{ video.title }}</h4>
        </a>
        {% endfor %}
    </div>
</div>

결과