IT 개발/Django

[Django] 장고, paging 구현방법 (게시판 페이징 구현방법)

KADOSHOLY 2024. 1. 2. 02:11
반응형

 

Django - 장고, paging 구현방법 (게시판 페이징 구현방법)

 

 

   목차

  1.  게시판 페이징 구현방법
    1. urls.py
    2. testapp > models.py
    3. testapp > views.py
    4. templates > testapp > member.html
    5. 실행결과

 

 

1. 게시판 페이징 구현방법

 

게시판에서 항목이 많은 경우 페이지별로 나누어 보여주어야 되기 때문에 페이징 기능을 구현해야 합니다. 여기에서는 장고에서 페이징 구현예제를 살펴보도록 하겠습니다. 

 

1) urls.py

# config > urls.py
urlpatterns = [
    path("testapp/", include('testapp.urls')),
]

# testapp > urls.py
urlpatterns = [
   path('member/', views.member, name='member')
]

 

2) testapp > models.py

from django.db import models

class TestTb(models.Model):
    id = models.IntegerField(primary_key=True)
    name = models.CharField(max_length=20, blank=True, null=True)
    age = models.IntegerField(blank=True, null=True)

    class Meta:
        managed = False
        db_table = 'test_tb'

 

3) testapp > views.py

from django.shortcuts import redirect, render
from testapp.models import TestTb
from django.core.paginator import Paginator

def member(request):
    now_page = request.GET.get('page', 1)

    data = TestTb.objects.all()
    p = Paginator(data, 2)
    info = p.page(now_page)

    start_page = (int(now_page)-1) // 10 * 10 + 1
    end_page = start_page + 9
    if end_page > p.num_pages:
        end_page = p.num_pages
    page_range = range(start_page, end_page+1)

    context = {'info':info,
               'page_range':page_range,
               'start_page':start_page !=1,
               'end_page':end_page % 10 == 0,
               }
               
    return render(request, 'testapp/member.html', context)

 

4) templates > testapp > member.html

  • bootstrap@5.3.1 사용
  • 변수에 숫자를 더하거나 빼는 방법 : {{ 변수 | add : "-10" }}
<!DOCTYPE html>
<html lang="en">
<head>...</head>
<body style='margin:30px; text-align: center;'>
    <table class='table table-striped'>
        <tr class="table-primary">
            <td>번호</td>
            <td>이름</td>
            <td>나이</td>
        </tr>
        {% for data in info %}
        <tr>
            <td>{{ data.id }}</td>
            <td>{{ data.name }}</td>
            <td>{{ data.age }}</td>
        </tr>
        {% endfor %}
    </table>
    <div style='text-align:center;'>
        <ul class='pagination justify-content-center'>
            {% if start_page %}
            <li class="page-item">
                <a class="page-link" 
                   href='{% url "member" %}?page={{ page_range.0 | add:"-10" }}'> << </a>
            </li>
            {% endif %}
            {% if info.has_previous %}
            <li class="page-item">
                <a class="page-link" 
                   href='{% url "member" %}?page={{ info.previous_page_number }}'> < </a>
            </li>
            {% endif %}

            {% for i in page_range %}
            <li class="page-item">
               <a class="page-link" href='{% url "member" %}?page={{ i }}'> {{ i }} </a>
            </li>
            {% endfor %}

            {% if info.has_next %}
            <li class="page-item">
                <a class="page-link" 
                   href='{% url "member" %}?page={{ info.next_page_number }}'> > </a>
            </li>
            {% endif %}
            {% if end_page %}
            <li class="page-item">
                <a class="page-link" 
                   href='{% url "member" %}?page={{ page_range.0 | add:"10" }}'> >> </a>
            </li>
            {% endif %}
        </ul>
    </div>
</body>
</html>

 

[실행결과]

페이징 적용 실행결과
페이징 적용 실행결과

 

반응형