20.Django(장고) - ecommerce 프로젝트 - 페이징

JungSik Heo·2024년 12월 6일

대량 테스트 데이터 만들어 보자

1. management/commands 폴더 만들기

management/commands 폴더 만들기
폴더 구조 조심!!

make_post.py 파일을 만드후 아래의 명령어

import sys
from typing import Any
from django.core.management import BaseCommand

from boards.models import Post



class Command(BaseCommand):
    def handle(self, *args, **options):
        print("make post start :)")

        for i in range(1, 101):
            # Todo.objects.create(name=f"테스트 todo {i}", complete=choice([True, False]))
            # todo = Todo.objects.create(name=f"테스트 todo {i}")
            post, created = Post.objects.get_or_create(title=f"테스트 post {i}",content=f"테스트 post {i}")
            if created:
                print(f"{i}번째 todo 생성 완료")
            else:
                print(f"{i}번째 todo 이미 존재")
        
        sys.stdout.write(self.style.SUCCESS("make post end :)"))
        print(post)

        

        

python manage.py make_post

2.Paginator -페이징을 해보자

def index(request):
    page = request.GET.get('page', '1')  # 페이지
    
    post_list = Post.objects.order_by('-created_at')
    
    paginator = Paginator(post_list, 10)  # 페이지당 10개씩 보여주기
    page_obj = paginator.get_page(page)
    context = {'post_list': page_obj} 
    #context = {'post_list': post_list}

page = request.GET.get('page', '1')은 http://localhost:8000/boards/?page=1 처럼 GET 방식으로 호출된 URL에서 page값을 가져올 때 사용한다.

만약 http://localhost:8000/boards/ 처럼 page값 없이 호출된 경우에는 디폴트로 1이라는 값을 설정한다

그리고 Paginator 클래스를 다음처럼 사용했다.

paginator = Paginator(question_list, 10) # 페이지당 10개씩 보여 주기

3.템플릿에 페이징 적용하기

templates\boards\post_list.html

{% extends 'layout/base.html' %}
{% block content %}
  <div class="container my-3">
    <table class="table">
      <thead>
        <tr class="table-dark">
          <th>번호</th>
          <th>제목</th>
          <th>작성일시</th>
        </tr>
      </thead>
      <tbody>
        {% if post_list %}
          {% for post in post_list %}
            <tr>
              <td>{{post.id}}</td>
              <td>
                <a href="{% url 'boards:detail' post.id %}">{{ post.title }}</a>
              </td>
              <td>{{ post.created_at }}</td>
            </tr>
          {% endfor %}
        {% else %}
          <tr>
            <td colspan="3">게시글이 없습니다</td>
          </tr>
        {% endif %}
      </tbody>
    </table>
    <!-- 페이징처리 시작 -->
    <ul class="pagination justify-content-center">
      <!-- 이전페이지 -->
      {% if post_list.has_previous %}
        <li class="page-item">
          <a class="page-link" href="?page={{ post_list.previous_page_number }}">이전</a>
        </li>
      {% else %}
        <li class="page-item disabled">
          <a class="page-link" tabindex="-1" aria-disabled="true" href="#">이전</a>
        </li>
      {% endif %}
      <!-- 페이지리스트 -->

      {% for page_number in post_list.paginator.page_range %}
        {% if page_number == post_list.number %}
          <li class="page-item active" aria-current="page">
            <a class="page-link" href="?page={{ page_number }}">{{ page_number }}</a>
          </li>
        {% else %}
          <li class="page-item">
            <a class="page-link" href="?page={{ page_number }}">{{ page_number }}</a>
          </li>
        {% endif %}
      {% endfor %}
      <!-- 다음페이지 -->
      {% if post_list.has_next %}
        <li class="page-item">
          <a class="page-link" href="?page={{ post_list.next_page_number }}">다음</a>
        </li>
      {% else %}
        <li class="page-item disabled">
          <a class="page-link" tabindex="-1" aria-disabled="true" href="#">다음</a>
        </li>
      {% endif %}
    </ul>
    <!-- 페이징처리 끝 -->

    <a href="{% url 'boards:post_create' %}" class="btn btn-primary">글 등록하기</a>
  </div>
{% endblock %}

templates\boards\post_list.html

페이징 처리는 잘 되었지만 한 가지 문제를 발견할 수 있다. 문제는 위에서 보듯이 이동할 수 있는 페이지가 모두 표시된다는 점이다.

이 문제를 해결하기 위해 다음과 같이 템플릿을 수정하자.

      {% for page_number in post_list.paginator.page_range %}
        {% if page_number >= post_list.number | add : -5 and page_number <= post_list.number | add : 5 %}
          {% if page_number == post_list.number %}
            <li class="page-item active" aria-current="page">
              <a class="page-link" href="?page={{ page_number }}">{{ page_number }}</a>
            </li>
          {% else %}
            <li class="page-item">
              <a class="page-link" href="?page={{ page_number }}">{{ page_number }}</a>
            </li>
          {% endif %}
        {% endif %}
      {% endfor %}

profile
쿵스보이(얼짱뮤지션)

0개의 댓글