티스토리 뷰

django

django / 검색 기능

4567은 소수 2021. 1. 3. 03:10

이번에는 검색 기능을 만들어보겠습니다. 검색 기능 또한 직전 포스팅인 정렬과 같은 html에 만들면 좋지만 그러면 강제적으로 만들어 놓은 url을 수정해야되서 새로 url을 만들어서 하겠습니다.

 

urlpatterns에 다음을 추가합니다.

path('search/',views.search, name="search"),

views를 만듭시다.

from django.db.models import Q

def search(request):
  content_list = Content.objects.all()
  search = request.GET.get('search','')
  if search:
    search_list = content_list.filter(
      Q(title__icontains = search) | #제목
      Q(body__icontains = search) | #내용
      Q(writer__username__icontains = search) #글쓴이
    )
  paginator = Paginator(search_list,5)
  page = request.GET.get('page','')
  posts = paginator.get_page(page)
  board = Board.objects.all()

  return render(request, 'search.html',{'posts':posts, 'Board':board, 'search':search})

새로 추가해야하는 내용은 Q라는 모듈을 import 해야합니다. Q는 django의 쿼리를 가져오는 모듈입니다.

'search'라는 이름의 값을 가지는 것을 get으로 가져온 뒤 해당 search 값이 존재한다면 전체 게시글(content_list)에서

Q('필드'__icontains = get값) 을 이용해 해당 get 값을 가지는 필드의 내용을 가져옵니다(filter).

 

저는 제목, 내용, 글쓴이 이렇게 검색되도록 하였습니다. 여러가지 검색은 | (or) 를 이용해주면 됩니다.

 

그리고 똑같이 pagination을 적용합니다.

 

search.html에서도 앞선 정렬과 마찬가지로 search값이 다음 페이지로 넘어가면 없어지는 결과가 나와 강제적으로 url을 설정하였습니다. form은 다음과 같습니다.

  <form method="GET" action="{% url 'search' %}">
  <!--pagenation-->
  <div class="pagination">
    {% if posts.has_previous %}
      <a href="?page=1&search={{search}}">First</a>
      <a href="?page={{posts.previous_page_number}}&search={{search}}">Previous</a>
    {% endif %}

    <span>{{posts.number}} / {{posts.paginator.num_pages}}</span>

    {% if posts.has_next %}
      <a href="?page={{posts.next_page_number}}&search={{search}}">Next</a>
      <a href="?page={{posts.paginator.num_pages}}&search={{search}}">Last</a>
    {% endif %}
  </div>

  <!--검색-->
  <div id="search">
    <input name="search" type="text">
    <button class="btn btn-primary" type="submit">검색</button>
  </div>
  </form>

결과는 다음과 같습니다. (search 로 연결하는 링크는 home에서 만들었으나 별 거 아니므로 넘어가겠습니다.)

123을 검색한 결과입니다.

글쓴이 이름 중에 123이 들어간 글과 제목에 123이 들어간 글들이 보입니다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함