-
게시판 검색 기능 구현 과정 정리Backend/Projects_report 2023. 12. 15. 11:39
점프투장고를 따라 게시판 개발 중 유독 헷갈렸던 검색 기능의 구현 과정을 정리해 보았다.
참고: https://wikidocs.net/71806
3-14 검색
* `[완성 소스]` : [github.com/pahkey/jump2django/tree/3-14](https://github.com/pahkey/jump2django/tree/…
wikidocs.net
구현 목표
- 검색어를 입력할 입력 Bar와 검색 Button 추가
- 검색 버튼 클릭 시 Get 방식으로 페이지 요청
- 질문 제목, 내용, 작성자, 답변 내용, 작성자 중 검색어가 포함된 질문 글은 검색 결과에 포함
- 검색 결과는 질문 목록을 Paging 처리하여 화면에 출력
구현 과정
검색은 Get 방식의 Request를 사용하는 것이 좋다. '뒤로 가기'처럼 동일한 요청을 반복하는 동작이 발생하면 POST의 경우 중복된 요청들을 '만료된 페이지입니다.'로 처리해버린다. 검색은 특히 검색 후 뒤로 가기를 해야 하는 상황이 자주 발생하므로 POST보다는 GET 으로 처리하는 것이 더 적절한 방법이다.
http://~?kw={검색어}&page={Page번호}
[Template]
1. 검색 Bar와 검색 Button 추가: 이 때 Button은 Javascript로 Click Event를 연결하기 위해 id 속성을 추가한다.
2. Get 요청을 하는 모든 UI를 Javascript로 처리하기 위해 수정: class 혹은 id 추가, href는 "javascript:void(0)"로 변경
3. Javascript에서 처리한 Data를 Request로 전송할 <form> 추가:
- method="get", id 속성 추가
- <form> 하위에 검색어와 Page 번호를 담는 <input type="hidden" id=~ value=~> 추가
4. Get 요청을 하는 UI로부터 Data를 읽고 전달하는 Javascript 작성.
- Classname이나 id로 원하는 Element를 찾아 Value 를 얻는다.
- 얻은 Data를 hidden type의 input element에 저장
- form element를 submit.
[View 함수]
검색 결과를 출력하는 함수는 게시판 목록을 보여주는 index 함수를 재활용한다.
index 함수에서 Get으로 요청된 검색어와 Page 번호 값을 각각 받아온다.
page = request.get("page", '1') kw = request.get("kw", '')
kw가 빈 값이 아니면 해당 값이 다음 중 한 곳에라도 포함된 질문 객체를 추출한다. filter() 와 Q object 사용
(kw 값의 포함 여부를 확인할 Data : 질문의 제목(subject), 내용(content), 작성자(author) 답변의 내용, 작성자)
question_list = Question.objects.order_by("-create_date") if kw: q_list = question_list.objects.filter(Q(subject__icontains=kw) | Q(content__icontains=kw) | Q(author__username__icontains=kw) | Q(answer__content__icontains=kw) | Q(author__author__username__icontains=kw))
검색어가 포함된 질문 목록들은 render 함수를 통해 Template 으로 전달한다.
'Backend > Projects_report' 카테고리의 다른 글
[Django] runserver 실행 시 ModuleNotFoundError: No module named '{project_name}' (0) 2023.11.23 [배프의 오지랖][clone_coding] 온라인 쇼핑몰 프로젝트 (0) 2023.10.30 [Clone-Coding][배프의 오지랖] onlineshop - AWS 관련 (0) 2023.09.23