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 %}
'Language > 파이썬' 카테고리의 다른 글
장고(django) 로그인 기능 - 파이썬 장고를 활용한 쉽고 빠른 웹 개발 프로그래밍 (0) | 2022.02.02 |
---|---|
장고(django) 앨범, 사진 조회 기능 - 파이썬 장고를 활용한 쉽고 빠른 웹 개발 프로그래밍 (0) | 2022.01.29 |
장고(django) 태그 taggit - 파이썬 장고를 활용한 쉽고 빠른 웹 개발 프로그래밍 (0) | 2022.01.17 |
장고(django) 프로젝트 첫 페이지, 템플릿 상속 - 파이썬 장고를 활용한 쉽고 빠른 웹 개발 프로그래밍 (0) | 2022.01.11 |
장고(django)blog app(+아카이브) - 파이썬 장고를 활용한 쉽고 빠른 웹 개발 프로그래밍 (0) | 2022.01.05 |
댓글