티스토리 뷰

 장고에서는 테이블에 대한 복잡한 쿼리를 처리하기 위한 Q 객체를 제공한다.

이 객체를 사용하면 웹 서비스에서 검색 기능을 쉽게 구현할 수 있다.

검색할 모델(테이블)은 이미 구현되어있다고 가정한다.

나는 Post 테이블을 검색하도록 구현하였다.


url pattern : /search/

form : SearchForm

view : SearchFormView

template : search.html


urls.py

# 생략 ..
url(r'^search',SearchFormView.as_view(),name='search')

url 패턴을 설정해준다.


forms.py

from django import forms
class SearchForm(forms):
    word = forms.Charfield(label='Search Word')

template에 보일 form을 구현한다.


views.py

from blog.forms import SearchForm
from django.views.generic.edit import FormView
from blog.models import Post

class SearchFormView():
    form_class = SearchForm
    template_name = 'blog/search.html'

    def form_valid(self,form): # post method로 값이 전달 됬을 경우
        word = '%s' %self.request.POST['word'] # 검색어
        post_list = Post.objects.filter(
            Q(title__icontains=word) | Q(content__icontains=word) # Q 객체를 사용해서 검색한다.
               # title,context 칼럼에 대소문자를 구분하지 않고  단어가 포함되어있는지 (icontains) 검사
        ).distinct() #중복을 제거한다.
        context = {}
        context['object_list'] = post_list # 검색된 결과를 컨텍스트 변수에 담는다.
        context['search_word']= word # 검색어를 컨텍스트 변수에 담는다.
        return context

Q 객체를 사용하여 검색 기능 로직을 구현한다.


search.html

...

<form action="." method="post"> {% csrf_token %}
    {{ form.as_p }} <!-- form -->
    <input type="submit">
</form>
{% if object_list %} # 검색 결과가 있을 경우
{% for post in object_list %} 
{<a href="{{ post.get_absolute_url }}">{{ post.title }}</a># 검색된 리스트를 보여준다.
{% endfor %}
{% elif search_word %} # 검색 결과가 없을 경우
Search Word {{ search_word  }} Not Found! #  검색된 결과가 없다는 메세지를 보여준다. 
{% endif %}
...


이렇게 검색 결과가 뜨는 것을 볼 수 있습니다.ㅎ

오류가 있으면 댓글 달아주세요.




댓글