본문 바로가기
source-code/Django

Blogs App _ 검색 기능

by mattew4483 2021. 1. 4.
728x90
반응형

블로그에 있는 수많은 게시글 중 하나를 보고 싶을 때, 모든 게시글을 뒤적일 수는 없는 노릇.

검색을 통해 원하는 게시글을 찾을 수 있는 기능을 추가해보자.


1. urls 작성

urls.py

검색을 담당하는 함수 SearchFormView 에 대한 url 요청을 추가!

 

2. forms 작성

검색을 하기 위해서는 할 수 있는 틀이 필요하다! → forms.py 에서 틀을 만들어주자.

forms.py

이전 CommentForm을 작성했던 곳에 SearchForm도 적어주자.

class의 두가지 인자 중, 이번에는 forms.Form 이라는 임의의 입력 틀(모델은 참조하지 않은)을 만들어줬다!

 

3. views 작성

views.py

우선 django generic view에서 FormView를 import!

방금 만든 PostSearchForm도 가져오자.

또한 검색 기능에 필요한 Q 클래스를 import!

 

views.py

이제 SearchView를 적어주면 되는데... 흐아.

천천히 살펴보자.

 

우선 우리가 만든 SearchFormView는 FormView라는 클래스형 뷰를 사용했다.

FormView는 무슨 기능을 할까!

 

만약 함수형 뷰를 사용한다면 PostSearchForm(request.POST)를 작성해줘야 한다(댓글 기능 참고).

즉 POST 요청일 경우... 유효성 검사를 하고 어쩌고를 입력했을 테다.

 

하지만 FormView를 통해서라면? 요 녀석은 GET요청인 경우 form을 화면에 보여주고 사용자 입력을 기다린다.

사용자가 입력 후 제출하면, 이는 POST 요청으로 접수되며, FormView는 이에 대한 유효성 검사를 실행한다.

데이터가 유효하다면 form_valid() 함수를 실행한 후 적절한 url로 redirect 시키는 역할을 수행!

form_class와 template_name을 통해 각각 어떤 form을 받으며, 어느 html에 띄워줄지 지정해주자.

 

다음. POST 요청으로 들어온 데이터의 유효성 검사를 실시한다.

에러가 없으면 form_valid를 실행!

 

유효성 검사를 통과하면 cleaned_data라는 사전에 값들이 저장된다.

이 사전에서 사용자가 입력한 값(여기서는 search_word)을 추출해 searchWord라는 변수에 저장했다!

 

게시글(Post모델)에서 filter를 주는데, 이때 아까 import 했던 Q 객체를 사용한다!

즉 filter메소드는 원래 하나의 조건으로 찾는데, 요 녀석을 통해 매칭 조건을 다양하게 줄 수 있다.

지금은 그 조건을 OR(|)로 연결한 것! 

 

각 조건에서 사용한 icontatins 연산자는 대소문자를 구분하지 않고 단어가 포함되어 있는지 검사한다.

즉 title, description, content에서 사용자가 입력한 값(searchWord)을 포함하고 있는지 찾는다.

distinct()를 통해 중복된 객체는 제외하도록!

 

이제 검색용 단어인 searchWord와, 검색 결과 리스트인 post_list를 context 변수에 담아 넘겨주면 된다!

이때 context를 미리 선언해줘야 하는데, cleaned_data라는 사전에서 가져온 값들이니, context도 dic 형식으로 선언.

이후 form, searchWord, post_list를 context 변수에 담아 넘겨준다.

또한 단순히 return으로 context만 넘겨주지 않고,

render를 통해 HttpResponseREdirect가 아닌 HttpResponse를 반환.

 

4. templates 작성

post_all.html

검색 페이지로 향하게 하는 곳에 href를 걸어주자.

 

post_search.html

templates 폴더에 post_search.html을 새로 만들어주자!

 

길기도 하니... 위에서부터 차근차근.

 

우선 form을 띄워주자.

action="."으로 똑같은 url(blogs/search/)에서 처리하도록.

POST 요청을 보내고 csrf_token도 야무지게.

 

if 문을 써서 object_list(검색 결과 리스트)가 있을 경우...!

이를 for문으로 돌려 각 게시글들의 title, modify_dt, description 을 띄워준다.

 

검색을 했는데 검색 결과가 없을 경우...!

elif search_term으로 검색 단어가 있으면 해당 단어가 없다고 띄워준다.


흐암. 잘 쳤다면 이렇게 작동한다.

 

post_detail.html

우선 검색 페이지로 이동하는 href를 만들어주고...

 

post_search.html

클릭하면 이렇게 검색 페이지로 이동!

 

특정 키워드를 검색하면 title, description, content에 해당 키워드가 있는 게시글을 띄워준다.

아무 게시글도 매칭 되지 않으면? 해당 단어가 없다는 설명을 띄워준다. 끝!

728x90
반응형

'source-code > Django' 카테고리의 다른 글

Blogs App _ CRUD  (0) 2021.01.05
Blogs App _ 인증 기능  (0) 2021.01.05
Blogs App _ 댓글 기능  (0) 2021.01.02
Blogs App _ tag 기능  (0) 2021.01.01
Blogs App  (0) 2020.12.31