본문 바로가기
Language/파이썬

장고(django) 블로그 글 검색(Search) - 파이썬 장고를 활용한 쉽고 빠른 웹 개발 프로그래밍

by javapp 자바앱 2022. 1. 23.
728x90


 

검색 창
검색 성공
검색 실패

 

 


 

 

1.

URLconf 코딩하기

blog/urls.py

...
    # /blog/search
    path('search/',views.SearchFormView.as_view(), name='search') # 검색
]

 

 

2.

HTML 폼 태그를 클래스로 정의

blog/form.py

# HTML 폼 태그도 클래스로 정의

# 폼 클래스 표현
from django import forms

class PostSearchForm(forms.Form):
    # 테이블의 모델 클래스를 정의하는 방법과 매우 유사
    # CharField 필드는 TextInput 위젯으로 표현, label='Search Word' 는 폼 위젯 앞에 출력 되는 레이블
    # 결국 HTML 요소 <input type="text> 하나를 만든 것
    search_word = forms.CharField(label='Search Word')

 

파라미터 label를 정의하면 검색 태그 앞에 출력되는 레이블이 생긴다.

 

 

3.

클래스형 뷰 SearchFormView 추가

blog/views.py

#검색
from django.views.generic import FormView
# forms.py에서 정의한 폼 태그 요소
from blog.forms import PostSearchForm
from django.db.models import Q # 검색 기능
from django.shortcuts import render # 단축 함수

 

...

# --- Form View for Search
# GET : 폼을 화면에 보여주고 사용자의 입력을 기다린다.
# 사용자 제출 -> POST : FormView 는 데이터의 유효성 검사, 유효하면 form_valid() 함수 실행후 적절한 URL 리다이렉트
class SearchFormView(FormView):
    form_class = PostSearchForm                         # 폼으로 사용될 클래스
    template_name = 'blog/post_search.html'

    def form_valid(self, form):                         # POST 요청으로 들어온 데이터 유효성 검사를 실시, 에러 없으면 form_valid() 실행
        searchWord = form.cleaned_data['search_word']   # search_word 키는 PostSearchForm 클래스에서 정의한 필드 이름
        # icontains : 대소문자 구분 x, 단어 포함되어 있는지 검사 , distinct : 중복 제외
        post_list = Post.objects.filter(Q(title__icontains=searchWord) | Q(description__icontains=searchWord) | Q(content__icontains=searchWord)).distinct()

        context ={}
        context['form'] = form
        context['search_term'] = searchWord
        context['object_list'] = post_list

        return render(self.request, self.template_name, context)

 

 

 

4. 

템플릿

{% extends "base.html" %}

{% block title %} post_search.html {% endblock %}

{% block content %}
<h1>Blog Search</h1>
<br>

<form action="." method="post"> {% csrf_token %} <!-- cross site request forgery 공격 방어 -->
    {{ form.as_table }}                          <!-- form 을 테이블 형식으로 표시 , PostSearchForm 객체 -->
    <input type="submit" value="Submit" class="btn btn-primary btn-sm">
</form>
<br/><br/>

{% if object_list %}

{% for post in object_list %}
    <h2><a href="{{ post.get_absolute_url }}">{{post.title}}</a> </h2>
    {{post.modify_date|date:"N d, Y"}}
    <p>{{post.description}}</p>
{% endfor %}

<!--즉 사용자가 검색 단어를 입력하고 검색 결과가 없을 경우, 다음 줄의 Not Found 문장을 표시-->
{% elif search_term %}
    <b><i>Search Word ({{search_term}}) Not Found</i></b>
{% endif %}
{% endblock %}

 

if else 구문

 

{% if object_list %}

{% for post in object_list %}
...
{% endfor %}

<!--즉 사용자가 검색 단어를 입력하고 검색 결과가 없을 경우, 다음 줄의 Not Found 문장을 표시-->
{% elif search_term %}
...

{% endif %}
{% endblock %}

댓글