참고
Django Documentation | QuerySet API reference
Django Documentation | Making queries
Stackoverflow - Default value of request.GET.get()
초보몽키의 개발공부로그- Queryset을 활용한 아주 간단한 필터검색 구현
실습 저장소
https://github.com/JisunParkRea/djangotube_tutorial
구현하고자 하는 기능
- 검색 단어를 포함한 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>
결과