본문 바로가기
인터페이스 개발/Django

Django - [Blog 앱 확장] 검색 기능

by cooluk 2020. 10. 7.

Blog 앱 확장 - 검색 기능 -


애플리케이션 설계하기

화면 구성

image-20201006224529177


URL 설계

image-20201006224551074


작업 절차

image-20201006224609052


개발 코딩하기

blog/forms.py

from django import forms

class PostSearchForm(forms.Form):
    search_word = forms.CharField(label='Search Word')

html로 구성 안하고 여기에 form 관련 내용 집어 넣음


blog/views.py

 :
from django.views.generic import FormView
from django.db.models import Q
from django.shortcuts import render
from blog.forms import PostSearchForm

:
#--- FormView
class SearchFormView(FormView):
    form_class = PostSearchForm
    template_name = 'blog/post_search.html'

    def form_valid(self, form):
        searchWord = form.cleaned_data['search_word']
        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)

post_list ≒ TITLE LIKE '%search_word%'


blog/urls.py

from django.urls import path, re_path
from blog import views

app_name = 'blog'
urlpatterns = [
    :
    # Example: /blog/search/
    path('search/', SearchFormView.as_view(), name='search'),
]

menu.html

:
<li class="nav-item dropdown mx-1 btn btn-primary">
    <a class="nav-link dropdown-toggle text-white" href="#"
       data-toggle="dropdown">Util</a>
    <div class="dropdown-menu">
        <a class="dropdown-item" href="{% url 'admin:index' %}">Admin</a>
        <div class="dropdown-divider"></div>
        <a class="dropdown-item" href="{% url 'blog:post_archive' %}">
            Archive</a>
        <a class="dropdown-item" href="{% url 'blog:search' %}">Search</a>
    </div>
</li>
</ul>
:

blog/templates/blog/post_search.html

{% extends "base.html" %}

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

{% block content %}

<h1>Blog Search</h1>
<br>
<form action="." method="post"> {% csrf_token %}
    {{ form.as_table }}
    <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_dt|date:"N d, Y" }}
        <p>{{ post.description }}</p>
        {% endfor %}

    {% elif search_term %}
    <b><i>Search Word({{ search_term }}) Not Found !</i></b>
    {% endif %}
{% endblock %}

소스보기로 {{ form.as_table }} 확인 가능


댓글