페이지 매김을 활용하면 특히 광범위한 데이터 세트를 처리할 때 사용자 인터페이스와 애플리케이션의 전반적인 성능을 향상시킬 수 있습니다. 페이지 매김 메커니즘이 없으면 애플리케이션의 로딩 시간이 길어질 수 있습니다. 페이지 매김에 대한 Django의 기본 지원을 사용하면 이 기능을 웹 애플리케이션에 손쉽게 통합할 수 있습니다.
장고에서 페이지 매김이 작동하는 방식
장고 애플리케이션 내에서 페이지 매김을 통합하는 것은 클래스 기반 또는 함수 기반 관점을 활용하는 방식에 따라 달라질 수 있습니다. 그럼에도 불구하고 유지되는 기본 개념은 모든 접근 방식에 걸쳐 동일합니다.
페이지 매김할 데이터 및 페이지당 표시할 항목 수입니다. 또한 고아에 대한 선택적 세 번째 인수를 제공하여 최종 페이지를 차지하는 데 필요한 최소 항목 수를 지정할 수 있습니다. 기본적으로 고아의 기본값은 0으로 설정되어 각 페이지에 동일한 수의 항목이 포함되도록 합니다.
앞서 언급한 URL 구조는 Django 애플리케이션 내에서 페이지가 매겨진 페이지를 나타내며, 여기서 “?” 기호는 페이지 매개변수가 포함된 쿼리 문자열을 나타냅니다. 이 매개 변수는 사용자가 원하는 페이지 번호를 표시하는 역할을 하며, 장고가 특정 페이지에 표시할 관련 데이터 하위 집합을 선택하는 데 도움이 됩니다.
이 프로젝트와 관련된 소스 코드는 GitHub 리포지토리를 통해 액세스할 수 있으며, MIT 라이선스에 따라 어떠한 비용이나 제한 없이 자유롭게 사용할 수 있습니다.
페이지 매김을 위한 장고 프로젝트 설정
장고에서 페이지 매김을 활용하기 전에 먼저 애플리케이션이 컴퓨팅 장치에 설치되고 올바르게 구성되었는지 확인해야 합니다. 이 프로세스가 완료되면 관련 정보를 저장할 애플리케이션과 해당 모델을 장고 내에 생성해야 합니다. 이러한 모델의 기본 예는 다음과 같습니다.
from django.db import models
class Post(models.Model):
title = models.CharField(max_length=255)
author = models.CharField(max_length=50)
content = models.TextField('Post content')
def __str__(self):
return self.title
앞서 언급한 표현은 블로그 플랫폼을 위해 특별히 설계된 스키마를 간략하게 설명합니다. 여기에는 블로그 게시물의 세 가지 중요한 속성, 즉 제목, 작성자 및 본문 텍스트가 포함됩니다. 또한 관리 대시보드 내에서 사용성을 개선하기 위해 헤드라인을 검색하는 구현 방법도 포함되어 있습니다.
앞서 언급한 명령어의 실행을 통해 모델을 변환합니다.
python manage.py makemigrations && python manage.py migrate
모델을 재배치하면 ‘blog’ 디렉토리로 이동하여 ‘admin.py’ 파일에 액세스해야 합니다. 여기에서 제공된 코드를 활용하여 ‘포스트’라는 모델을 등록하는 프로세스를 매우 효율적으로 수행할 수 있습니다.
from django.contrib import admin
from .models import Post # replace 'Post' with your model name
admin.site.register(Post)
장고에서 권한이 있는 관리자 계정을 만들려면 루트 상태에서 터미널 또는 명령 프롬프트에 내장된 `createsuperuser` 명령을 활용할 수 있습니다. 이 과정에는 다음 명령을 실행하는 것이 포함됩니다: “`bash 파이썬 manage.py createsuperuser “` 이 단계를 수행하면 Django 관리 패널에서 관리자로서의 상승된 권한이 부여되어 다른 사용자의 자격 증명 없이도 다른 사용자를 대신하여 작업을 수행할 수 있습니다.
python manage.py createsuperuser
앞서 설명한 지침은 절차를 설명하는 아래 그림과 같은 시각적 표현을 통해 안내합니다.
상승된 권한으로 계정을 생성한 후 개발 서버를 활성화하고 웹 브라우저를 통해 해당 서버로 이동하여 관리 인터페이스에 액세스합니다.
python manage.py runserver
서버가 시작되면 웹 브라우저에서
“your\_app/templates/your\_app\_name/index.html”. 템플릿을 만드는 데 익숙하지 않은 경우, 장고의 MVT 아키텍처와 그 구현에 대한 통찰력을 제공하는 종합 가이드를 참조하세요.
함수 기반 보기에서 장고 페이지 매김
장고 프레임워크는 개발자에게 클래스 기반 보기와 함수 기반 보기라는 두 가지 사용자 인터페이스 구축 옵션을 제공합니다. 함수 기반 보기에서 페이지 매김을 구현하려면 아래 절차를 따르세요:
뷰에서 views.py 파일을 열고 django.core.paginator 모듈에서 Paginator 클래스를 가져와 페이지 매김 기능의 구현을 통합하세요.
from django.core.paginator import Paginator
HTML 템플릿에 글을 표시하려면 보기 함수를 구현해야 합니다.
from django.shortcuts import render
from .models import Post
from django.core.paginator import Paginator
def list_view(request):
posts = Post.objects.all()
return render(request, 'blog/blog_list_view.html', {'posts':posts})
웹 브라우저에 글을 표시하기 위한 URL 패턴을 만드는 과정에는 프로젝트 디렉터리 내에서 필요한 구성을 설정하고 프로젝트 수준에 있는 urls.py 파일을 수정하는 등 여러 단계가 포함됩니다. 이 작업을 수행하려면 사용자가 특정 URL 구조를 통해 자신의 글에 액세스할 수 있도록 urls.py 파일의 urlpatterns 섹션에 적절한 URL 패턴을 포함시켜야 합니다.
from django.urls import include
urlpatterns = [
...,
path('', include('blog.urls')),
]
앞서 언급한 코드 스니펫에서는 애플리케이션의 모니커를 “블로그”로 대체해야 합니다. 장고에서 프로젝트와 앱의 차이점이 확실하지 않은 경우, 이 두 엔티티의 차이점을 이해하는 것이 유리할 것입니다.
앞서 설명한 단계에 따라 제공된 코드 스니펫을 사용하여 블로그 폴더에 있는 앱 디렉터리 내에 urls.py 파일을 생성합니다.
from django.urls import path
from .views import list_view
urlpatterns = [
path('', list_view, name='list-view'),
]
서버를 시작하고 브라우저에서 웹 주소
페이지 매김 기능을 통합하기 위해 기존 보기 기능을 변경하는 행위를 “수정”이라고 할 수 있습니다. 이 프로세스에는 지정된 프레임워크 내에서 데이터 표시를 제어하고 규제하는 코드를 추가하여 전체가 아닌 부분 또는 세그먼트 단위로 정보를 표시할 수 있도록 하는 작업이 포함됩니다. 이 방법에 대한 그림은 다음과 같습니다:
def list_view(request):
posts = Post.objects.all()
paginated = Paginator(posts, 3)
page_number = request.GET.get('page') #Get the requested page number from the URL
page = paginated.get_page(page_number)
return render(request, 'blog/blog_list_view.html', {'page':page})
`페이지 번호`, `페이지_번호` 및 `페이지`. 이러한 엔티티는 다음과 같이 정의됩니다: * 페이지가 잘린` 개체는 API 응답이 잘랐는지 여부를 나타내는 지표로 사용되며 모든 레코드를 가져오려면 추가 요청이 필요합니다. API 호출에서 반환된 `exhaustion_token`의 길이가 10자 미만이면 더 이상 가져올 레코드가 없음을 의미하므로 `paginated`의 값은 False로 설정됩니다. 그렇지 않으면 이 변수에 `True`가 할당됩니다. * 페이지 번호` 엔티티는 API에서 검색되는 결과의 현재 페이지 번호를 보유합니다. 이 값은 1에서 시작하여 새 페이지가 나올 때마다 증가합니다.
페이지 매기기 클래스는 페이지 매기기 변수에 대한 참조로 초기화되었으며, 이 경우 페이지 매기기할 데이터, 즉 “posts”라는 쿼리 집합이 포함되어 있습니다. 페이지당 표시되는 항목 수는 3으로 지정되었습니다.
앞서 언급한 URI에는 “2”라는 값으로 할당된 “page”라는 쿼리 매개 변수가 포함되어 있습니다. 따라서 이 문자열이 함수에 의해 처리되면 정수로 변환되어 “page\_number” 변수에 저장되므로 적절한 응답을 결정하는 데 더 많이 활용될 수 있습니다.
“페이지” 변수는 “페이지 매김” 변수에 의해 표시되어야 하는 특정 웹페이지를 검색하는 데 사용됩니다.
이 시점에서는 장고가 웹 페이지에 페이지 매김을 구현했을 가능성이 높습니다. 페이지 매김된 세트 내의 특정 페이지에 액세스하려면 첨부된 그림에 표시된 지정된 URL 구조를 활용할 수 있습니다:
Paginator 클래스에서 제공하는 기능을 활용하여 페이지 매김된 페이지에 대한 탐색 기능을 통합하도록 HTML 템플릿을 수정합니다.기존 HTML 코드 아래에 다음 코드 스니펫을 추가하면 됩니다:
{% if page.has_previous %}
<a href="?page={{page.previous_page_number}}"
class="btn btn-secondary mx-2">Previous</a>
{% endif %}
<a href="?page=1" class="btn btn-secondary">First</a>
{% for num in page.paginator.page_range %}
{% if num == page.number %}
<span>{{ num }}</span>
{% else %}
<a href="?page={{num}}" class="btn btn-secondary mx-2">
{{ num }}
</a>
{% endif %}
{% endfor %}
<a href="?page={{page.paginator.num_pages}}" class="btn btn-secondary mx-2">
Last
</a>
{% if page.has_next %}
<a href="?page={{page.next_page_number}}" class="btn btn-secondary mx-2">
Next
</a>
{% endif %}
앞서 언급한 코드는 조건문을 여러 메서드와 함께 사용하여 페이지 매김 탐색의 모양을 설정합니다.
“has\_previous” 메서드는 페이지 매김된 데이터 집합 내에 이전 페이지가 존재하는지 여부를 나타내는 부울 값을 반환합니다.
이 텍스트의 앞부분은 “이전\_페이지\_번호”로 지정된 특정 속성이 검색되고 해당 값이 반환되는 프로세스를 식별합니다.
`page_range` 속성은 페이지가 매겨진 데이터 세트 내에 존재하는 페이지 수에 관한 정보를 제공합니다.
본 기술은 현재 웹 페이지에 해당하는 숫자 표현을 검색하는 것을 포함합니다.
앞서 언급한 속성은 이 리소스를 통해 액세스할 수 있는 페이지의 총 개수를 지정합니다.
“has\_next” 함수는 페이지 매김된 정보에 다음 페이지가 있는지 여부를 확인합니다.
앞서 언급한 접근 방식은 다음 페이지의 숫자 표현을 산출합니다.
클래스 기반 뷰에서의 장고 페이지 매김
페이지 매김을 구현하기 위한 클래스 기반 접근 방식에는 `paginate_by`라는 변수를 설정하는 것이 포함됩니다. 이를 통해 애플리케이션은 결과의 각 페이지에 표시할 항목 수를 결정할 수 있습니다. 이 방법을 활용하기 위해 추가 임포트를 포함하거나 ‘페이지네이터’ 객체에 대한 초기화 절차를 수행할 필요가 없습니다. 대신 다음 지침에 따라 클래스 기반 보기를 사용하여 페이지 매김된 검색 결과를 얻을 수 있습니다:
int): num_pages = len(list(filter(lambda x: x는 None이 아님, [range(1, items_per_page + 1)])))/items_per_page current_page = (page – 1) // items_per_page start = (current_page – 1) * items_per_page end = 시작 + 항목_당_페이지 results = list(filter(lambda x: x is not None, [
from .models import Post
from django.views.generic import ListView
class PostListView(ListView):
model = Post
template_name = 'blog/blog_list_view.html'
context_object_name = 'page'
paginate_by = 2
앞서 설명한 관점은 클래스 기반 기능을 통합한 앞서 설명한 함수 기반 관점을 변형한 것입니다. 이 특정 관점은 데이터 컬렉션을 표시하는 데 사용되는 Django의 ListView 클래스에 뿌리를 두고 있습니다. 이 클래스는 모델, 템플릿\_이름, 컨텍스트\_객체\_이름, 페이지네이트\_기준을 포함하되 이에 국한되지 않는 다양한 속성의 구현을 통해 기능적 특성을 설정합니다. 페이지별\_기준 속성은 각 페이지에 표시할 글의 수를 지정하는 용도로 사용되며, 이 예에서는 페이지당 두 개의 글이 표시됩니다.
다음과 같이 간단한 인스턴스를 사용하여 생성된 보기를 활용하기 위해 urls.py 파일을 수정합니다:
from .views import PostListView
urlpatterns = [
path('', PostListView.as_view(), name='list-view'),
]
페이지 매김과 관련하여 페이지\_obj를 활용하도록 HTML 템플릿을 수정합니다.
{% if page_obj.has_previous %}
<a href="?page={{page_obj.previous_page_number}}"
class="btn btn-secondary mx-2">Previous</a>
{% endif %}
<a href="?page=1" class="btn btn-secondary">First</a>
{% for num in page_obj.paginator.page_range %}
{% if num == page_obj.number %}
<span class="current-page">{{ num }}</span>
{% else %}
<a href="?page={{num}}" class="btn btn-secondary mx-2">
{{ num }}
</a>
{% endif %}
{% endfor %}
<a href="?page={{page_obj.paginator.num_pages}}"
class="btn btn-secondary mx-2">
Last
</a>
{% if page.has_next %}
<a href="?page={{page_obj.next_page_number}}"
class="btn btn-secondary mx-2">
Next
</a>
{% endif %}
현재 템플릿은 장고 내에서 클래스 기반 페이지 매김을 위한 표준 접근 방식인 `page`가 아닌 `page_obj`를 사용합니다.
페이지 매김을 사용하여 애플리케이션 확장성 확보
온라인 플랫폼 내에서 페이지 매김을 구현하면 로딩 용량과 전반적인 사용자 경험을 최적화할 수 있습니다. 페이지 매김은 주어진 시간에 정보의 작은 부분을 검색하고 표시하는 방식으로 작동하므로 서버와 데이터베이스 시스템 모두에 대한 부담을 최소화합니다. 이 기능을 구현하면 웹사이트 또는 애플리케이션 성능이 향상되는 동시에 사용자가 보다 효율적인 방식으로 필요한 콘텐츠에 액세스할 수 있습니다.
함수 기반 뷰와 클래스 기반 뷰는 장고에서 뷰를 처리하는 두 가지 다른 접근 방식입니다. 클래스 기반 뷰는 시간 절약 및 코드 복잡성 감소와 같은 이점을 제공하지만, 둘 다 특정 프로젝트에 더 적합할 수 있는 고유한 이점이 있으므로 반드시 둘 중 하나를 선택해야 할 필요는 없습니다.