티스토리 뷰
이번에는 검색 기능을 만들어보겠습니다. 검색 기능 또한 직전 포스팅인 정렬과 같은 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이 들어간 글들이 보입니다.
'django' 카테고리의 다른 글
Facebook 로그인 화면 CSS로 복습하기 (0) | 2021.01.09 |
---|---|
django / 게시글 정렬 구현 (0) | 2021.01.03 |
django / multiple authentication backends 에러 처리 (1) | 2020.12.29 |
django / 비밀번호 변경 (0) | 2020.12.29 |
django / 소셜 로그인 구현 (0) | 2020.12.29 |
댓글