CS

[Django] 페이징과 검색창 기능 구현하기

ji_iin 2021. 8. 7. 01:02

처음에 구현할 때

페이징을 쉽게 구현해놓고

검색기능을 구현하니

데이터가 보여지지가 않았다 🥲

페이징 구현하면 검색기능이 안되고,

검색기능 구현하면 페이징이 안되고 해서

엄청난 구글링과 조금의 생각을 통해 

결국 해결했다.

 

 

 

 

 < models.py >

책에 필요한 정보가 담긴 모델이다. 

이 모델에 나는 데이터를 삽입했기 때문에

밑에 구현한 html 첨부했지만, 데이터 값이 보이는 것이다.

CSV 파일 데이터베이스에 삽입하는 것도 정리해두었다.

참고링크

#기본적인 책 정보 
class BookClassInfo(models.Model):
    title = models.CharField("책제목", max_length=45)
    image = models.ImageField("책표지", blank=True,null=True)
    author = models.CharField("저자", max_length=45)
    price = models.IntegerField("가격",null=True)
    publisher = models.CharField("출판사", max_length=45)
    pubdate = models.DateField("출판일",null=True)
    stock = models.SmallIntegerField("재고", default=5)
    department = models.CharField("수업개설학과", max_length=30)
    class_name = models.CharField("수업명", max_length=30)
    professor = models.CharField("교수", max_length=30)

 

나는 프로젝트에서 백 파트를 담당하여

일단 테스트 html 파일로 서버 돌려서 작동확인 해보았다.

추후에 프론트 팀원들과 합칠 예정이다.

 

 

 

< views.py >

처음에 내가 했을 때 잘 적용이 되지 않았던 이유가

함수를 2개를 써서

1. category ( 페이징 )

2. search ( 검색창 )

기능이 따로 놀았던 것이다.

그래서 그냥 category 함수에 합쳐 사용했다.

 

[ 검색창 ]

검색 단어를 search 변수로 받아

검색한 단어가 있으면 책 제목에 검색단어가 포함된

책 리스트를 필터링을 했다.

 

[ 페이징 ]

한 페이지에 5개만 데이터 보이게 하였고,

몇번째 페이지인지도 받아와 그 페이지의 리스트도

넘겨 보여주게 하였다.

from django.core import paginator
from django.shortcuts import render
from .models import BookClassInfo
from django.core.paginator import Paginator

# Create your views here.
# 검색과 페이징
def category(request):
    
    books = BookClassInfo.objects.all()
    search = request.GET.get('search', '')

    if search:
        books = books.filter(title__icontains=search)

    paginator = Paginator(books, 5)
    page = request.GET.get('page', '') #몇번째 페이지인지 받아옴
    book_list = paginator.get_page(page) #posts

    return render(request, 'category.html', {'book_list':book_list, 'search':search })

 

 

 

< category.html >

검색 창에서 검색 단어를 입력하면

그 단어가 포함된 책의 목록을 불러오기만 하면 되니까

GET 방식을 이용하였다.

for문을 통해 책 리스트를 보였고,

이전 / 다음 글자에 링크를 두어 페이지 이동하였고,

페이지가 처음인데 이전하면 안되므로

조건문을 써서 있을 때만 보이게 했다. 

다음도 마찬가지이다.

{% extends 'base.html' %} 
{% load static %} 
{% block content %}
<link rel="stylesheet" href="{% static 'css/category.css' %}">
<h1>카테고리 페이지</h1>


<form method="GET" action="{% url 'category' %}">
  <input type="text" placeholder="책 제목을 입력하세요." name="search" value="{{search}}">
  <button type="submit">검색</button>
</form>
<div>
    {% for book in book_list %}
      <h3>{{ book.title }}</h1>
      <p>{{ book.department }}</p>
      <hr>
    {% endfor %}

  {% if book_list.has_previous %}
    <a href='?page={{book_list.previous_page_number}}&search={{search}}'>이전</a>
  {% endif %}
    <span>{{book_list.number}}</span>
    <span>/</span>
    <span>{{book_list.paginator.num_pages}}</span>
  {% if book_list.has_next %}
    <a href='?page={{book_list.next_page_number}}&search={{search}}'>다음</a>
  {% endif %}


</div>


{% endblock %}

 

 

< category.html 실제 페이지 >

 

페이지 안넘긴 초기 화면
페이지 넘겼을 때
해당단어 포함된 책 검색