코딩공부/Python Django

django q객체를 이용한 검색기능 만들기

integerJI 2020. 2. 27. 23:02

[django] python django 게시판 만들기 - 간단하게 검색기능 만들기

 

홈에 나오는 게시물들을 검색한다!


model, admin 설정 : https://integer-ji.tistory.com/89

views에 데이터 가져오기 : https://integer-ji.tistory.com/90

detail page 만들기 : https://integer-ji.tistory.com/91

setting 설정, 데이터 자르기, 정렬하기 : https://integer-ji.tistory.com/93

getbootstrap으로 홈페이지 꾸미기 : https://integer-ji.tistory.com/94

템플릿 상속, url 관리하기 : https://integer-ji.tistory.com/95

디자인 쪼끔 수정 : https://integer-ji.tistory.com/97

글 쓰기 기능 만들기 : https://integer-ji.tistory.com/99

글 수정 기능 만들기 : https://integer-ji.tistory.com/100

글 삭제 기능 만들기 : https://integer-ji.tistory.com/101

form 이용하기, 글 수정 instance 가져오기 : https://integer-ji.tistory.com/102

Pagination : https://integer-ji.tistory.com/106


search 함수 생성

def search(request):
    blogs = Blog.objects.all().order_by('-id')

    q = request.POST.get('q', "") 

    if q:
        blogs = blogs.filter(title__icontains=q)
        return render(request, 'search.html', {'blogs' : blogs, 'q' : q})
    
    else:
        return render(request, 'search.html')

 

간단하게 검색기능을 만들어 보겠습니당 

 

blogs에 모든 객체를 블로그 id의 역순으로 담습니다.

 

q의 이름으로 POST로 넘오온 값을 q에 담습니다.

 

blogs에는 filter을 하여 icontains을 이용해 q와 비교합니다.

 

비교해서 같으면 search.html에 blogs와 q를 넘겨줍니다.

 

그것이 아닐경우 search.html을 리턴합니다.

 

 

urls.py 수정

from django.urls import path
from . import views

urlpatterns = [
    path('new/', views.new, name='new'),
    path('detail/<int:blog_id>/', views.detail, name='detail'),
    path('create/', views.create, name='create'),
    path('postcreate/', views.postcreate, name='postcreate'),
    path('update/<int:blog_id>/', views.update, name='update'),
    path('delete/<int:blog_id>/', views.delete, name='delete'),
    path('search', views.search, name='search'),
]

 

새로만든 함수 search를 url에 등록합니다.

 

 

base.html 수정

<form class="form-inline my-2 my-lg-0" action="{% url 'search' %}" method="post">
{% csrf_token %}
<input class="form-control mr-sm-2" type="search" placeholder="Search" aria-label="Search" name="q" value="{{q}}">
<button class="btn btn-outline-success my-2 my-sm-0" type="submit">Search</button>
</form>

 

POST방식으로 input값을 q란 이름으로 넘겨줍니다.

 

넘겨줬다면 해당 value를 input 창에 띄워줍니다.

 

search.html 생성

{% extends 'base.html' %}

{% block content %}

    {% if not blogs %}

        <h1>검색 결과가 없습니다</h1>

    {% else %}

        {% for blog in blogs.all %}
        <div class="container"> 
            <div class="card">
                <div class="card-body">
                    <h1>{{ blog.title }}</h1>
                    <p>{{ blog.pub_date | date:"Y-m-d" }}</p>
                    <p>{{ blog.summary }}<a href="{% url 'detail' blog.id %}"> ...자세히 보기</a></p> 
                </div>
            </div>
        </div>
        <br>
        {% endfor %}

    {% endif %}

{% endblock %}

 

base.html을 상속 받습니다.

 

views.py에서 값을 넘겨줄때 만약이 검색결과가 없을때 즉 blogs가 없으면 검색 결과가 없다고 출력해주고

 

아닐경우

 

blogs.all을 뽑아줍니다

 

search 페이지에서의 blogs는 검색결과로 필터링 된 값들이 담겨있습니다.

 

그리고 endif로 닫아주면 끝!

 

 

확인

 

값이 두개인 100글자를 검색해 줍니다.

 

 

 

숨어있던 게시글까지 총 3개가 나옵니다.

 

마찬가지로 빈값을 입력하거나 없는 값을 입력하면~

 

 

 

git push

git init

git add .

git commit -m "코멘트"

 

git push origin master

 

 

---

 

다듬고 확인하기

 

남은것 이미지올리기 ( 미디어와 스태틱 )

 

회원가입기능 만들기