728x90
Paginator는 Django에서 대량의 데이터를 페이지로 나누어 보여주는 기능을 제공하는 클래스입니다. 예를 들어, 게시판에서 질문 목록이나 답변 목록을 페이지별로 나누어 보여줄 때 사용됩니다. 이를 통해 대량의 데이터가 한 번에 로드되는 것을 방지하고, 사용자에게 효율적인 데이터 탐색 환경을 제공합니다.
Paginator 사용법
1. Paginator 임포트
먼저 Paginator 클래스를 사용하기 위해 django.core.paginator에서 임포트합니다.
from django.core.paginator import Paginator
2. Paginator 객체 생성
Paginator 객체는 두 개의 필수 인자를 받습니다:
- object_list: 페이지로 나누려는 데이터 목록
- per_page: 한 페이지에 보여줄 항목의 수
예시로 Question 모델에서 데이터를 가져와 한 페이지에 10개의 항목을 표시하도록 설정하는 경우:
from pybo.models import Question
from django.core.paginator import Paginator
question_list = Question.objects.all() # 질문 목록 가져오기
paginator = Paginator(question_list, 10) # 한 페이지당 10개의 항목으로 나누기
3. 특정 페이지의 데이터 가져오기
Paginator로 데이터를 나눈 후 특정 페이지의 데이터를 가져오려면 page() 메서드를 사용합니다. 예를 들어 1페이지의 데이터를 가져오려면:
page_number = 1 # 현재 페이지 번호
page_obj = paginator.page(page_number) # 1페이지의 데이터를 가져옴
4. 템플릿에 전달하여 출력하기
page_obj를 템플릿으로 전달하여 페이지에 맞는 데이터를 보여줍니다.
context = {'page_obj': page_obj}
return render(request, 'pybo/question_list.html', context)
Paginator 주요 속성 및 메서드
- paginator.count: 전체 게시물의 개수를 반환합니다.
- paginator.per_page: 페이지당 보여줄 게시물의 개수를 반환합니다.
- paginator.page_range: 페이지 번호의 범위를 나타냅니다.
- number: 현재 페이지의 번호를 반환합니다.
- previous_page_number: 이전 페이지 번호를 반환합니다.
- next_page_number: 다음 페이지 번호를 반환합니다.
- has_previous: 이전 페이지가 있는지 확인하여 True 또는 False를 반환합니다.
- has_next: 다음 페이지가 있는지 확인하여 True 또는 False를 반환합니다.
- start_index: 현재 페이지의 시작 인덱스를 반환합니다(1부터 시작).
- end_index: 현재 페이지의 끝 인덱스를 반환합니다(1부터 시작).
전체 흐름 예시
뷰 함수
from django.core.paginator import Paginator
from pybo.models import Question
def question_list(request):
question_list = Question.objects.order_by('-create_date') # 최신순으로 정렬
paginator = Paginator(question_list, 10) # 한 페이지에 10개 항목
page_number = request.GET.get('page', 1) # GET 요청에서 페이지 번호 가져오기, 기본값은 1
page_obj = paginator.page(page_number) # 해당 페이지의 데이터 가져오기
context = {'page_obj': page_obj}
return render(request, 'pybo/question_list.html', context)
템플릿에서 페이지 처리
템플릿에서는 page_obj를 사용하여 데이터를 출력하고, 이전 페이지, 다음 페이지로 이동할 수 있는 링크를 추가할 수 있습니다.
<div>
{% for question in page_obj %}
<p>{{ question.subject }}</p>
{% endfor %}
</div>
<div>
{% if page_obj.has_previous %}
<a href="?page={{ page_obj.previous_page_number }}">Previous</a>
{% endif %}
<span>Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}</span>
{% if page_obj.has_next %}
<a href="?page={{ page_obj.next_page_number }}">Next</a>
{% endif %}
</div>
정리
- Paginator: 데이터를 페이지 단위로 나누는 클래스
- Paginator.page(): 특정 페이지의 데이터를 가져오는 메서드
- page_obj: 페이지 정보 및 데이터를 담고 있는 객체
- 템플릿에서: 페이지 탐색을 위해 page_obj의 속성들을 활용
이 방법을 사용하면 대량의 데이터를 효율적으로 페이지 단위로 나누어 보여줄 수 있습니다.
728x90
'Category > Django' 카테고리의 다른 글
django-environ란? (0) | 2024.09.16 |
---|---|
WSGI(웹 서버 게이트웨이 인터페이스, Web Server Gateway Interface)란? (1) | 2024.09.15 |
Django(장고) 템플릿 필터란? (0) | 2024.09.13 |
장고(Django) 역참조를 위한 '모델명_set' (0) | 2024.09.11 |
장고(Django) 마이그레이션이 필요한 경우와 필요 없는 경우 (0) | 2024.09.11 |