게시판 페이징 기능의 필요성
- 게시판의 글 개수가 많아질 경우 필요함
- 한 페이지에 10개만 보여주는 형식으로 만듬
데이터 불리기
터미널에서
- cd mysite
- manage.py shell 로 터미널 실행
- 그 후 아래 코드 입력
from pybo.models import Question
from django.utils import timezone
for i in range(300):
q = Question(subject = "질문글 [%03d]의 제목 입니다" % i, content = "내용은 생략" , create_date = timezone.now())
q.save()
views.py의 index함수 수정
from django.core.paginator import Paginator
def index(request):
page = request.GET.get("page","1") # 페이지의 번호를 가져옴 (그런데 첫 페이지는 1의 기본값 설정)
question_list = Question.objects.order_by('-create_date') # 최신순 정렬하기 위해 내림차순 - 붙임
paginator = Paginator(question_list , 10 )# 페이지당 10rofh rptlrmfdmf wpgks
page_obj = paginator.get_page(page) # 전체 데이터에서 요청한 페이지에 관한 게시글만 추출
#context = {"question_list":question_list}
context = {'question_list' : page_obj}
return render(request, 'pybo/question_list.html',context)
question_list.html 수정
페이지리스트 if 코드 해석
- 현재 페이지가 1이라면, page_number ≥ 1-5 and page_number ≤ 1+5
- -4 ≤ page_number ≤6 는 우리가 -페이지는 존재하지 않기 때문에 1번 페이지부터 6번까지 보여줌
- 현재 페이지가 16이라면
- 11 ≤ page_number ≤ 21 이므로 11~21 페이지를 보여줌(아래 사진)
{% extends 'base.html' %}
{% block content %}
<div class="container my-3">
<table class="table">
<thead>
<tr class="table-dark text-center">
<th>번호</th>
<th>제목</th>
<th>작성일시</th>
</tr>
</thead>
<tbody>
{% if question_list %}
{% for question in question_list %}
<tr class="text-center">
<td>{{ forloop.counter }}</td>
<td>
<a href="{% url 'pybo:detail' question.id %}">{{ question.subject }}</a>
</td>
<td>{{ question.create_date }}</td>
</tr>
{% endfor %}
{% else %}
<tr>
<td colspan="3">질문이 없습니다.</td>
</tr>
{% endif %}
</tbody>
</table>
<!-- 페이징처리 시작 -->
<ul class="pagination justify-content-center">
<!-- 이전페이지 -->
{% if question_list.has_previous %}
<li class="page-item">
<a class="page-link" href="?page={{ question_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 question_list.paginator.page_range %}
{% if page_number >= question_list.number|add:-5 and page_number <= question_list.number|add:5 %}
{% if page_number == question_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 %}
<!-- 다음페이지 -->
{% if question_list.has_next %}
<li class="page-item">
<a class="page-link" href="?page={{ question_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 class="btn btn-primary" href="{% url "pybo:question_create" %}">질문 등록</a>
</div>
{% endblock %}
수정된 페이지 확인
'Back > Django' 카테고리의 다른 글
6. 로그인 로그아웃 구현하기 (0) | 2023.04.20 |
---|---|
5. 템플릿 필터 직접 만들어 보기 + 질문에 답변 개수 표시하기 (0) | 2023.04.19 |
3.5 Django 흐름 정리 (0) | 2023.04.19 |
3. 장고 부트스트랩으로 화면 꾸미기 (0) | 2023.04.19 |
2. 장고의 기본 요소 Admin, 렌더링, 동적URL매핑,DB연동 (0) | 2023.04.13 |