페이지 매김을 구현하여 사용자가 10, 25, 50 등의 페이지 당 레코드 수를 선택할 수 있도록하고 싶습니다. 어떻게해야합니까? 내 프로젝트에 추가 할 수있는 앱이 있나요?Django의 유연한 페이지 매김
감사합니다 "장고 매김"및 확인에
페이지 매김을 구현하여 사용자가 10, 25, 50 등의 페이지 당 레코드 수를 선택할 수 있도록하고 싶습니다. 어떻게해야합니까? 내 프로젝트에 추가 할 수있는 앱이 있나요?Django의 유연한 페이지 매김
감사합니다 "장고 매김"및 확인에
Django에는 Paginator 객체가 코어에 내장되어 있습니다. 사용하기에 다소 간단한 API입니다. 두 개의 인수를 가진 Paginator
클래스를 인스턴스화하십시오 : "페이지"당 목록 및 항목 수. 하단에 샘플 코드를 붙여 넣을 것입니다.
귀하의 경우 사용자가 페이지 당 개수를 선택할 수 있도록 허용하려고합니다. 페이지 당 페이지 수를 URL의 일부 (즉,/page/10 /)로 만들거나 쿼리 문자열 (예 :/page /? p = 10)으로 만들 수 있습니다. 페이지 배열이 더 잘 작동 방법을 볼 수 있도록
뭔가 같은 ...
# Assuming you're reading the Query String value ?p=
try:
per_page = int(request.REQUEST['p'])
except:
per_page = 25 # default value
paginator = Paginator(objects, per_page)
여기 장고 문서 페이지에서 몇 가지 예제 코드입니다.
>>> from django.core.paginator import Paginator
>>> objects = ['john', 'paul', 'george', 'ringo']
>>> p = Paginator(objects, 2)
>>> p.count
4
>>> p.num_pages
2
>>> p.page_range
[1, 2]
>>> page1 = p.page(1)
>>> page1
<Page 1 of 2>
>>> page1.object_list
['john', 'paul']
구글 효율적인 쿼리에 대한 SQL에 "커버링 인덱스"를 사용합니다.
T. 스톤의 대답은 제가 말하고자하는 대부분의 내용을 다루고 있습니다. 난 그냥 Generic Views에 페이지 매김을 사용할 수 있다고 덧붙이고 싶습니다. 특히 django.views.generic.list_detail.object_list
이 유용 할 수 있습니다.
request
개체에서 페이지 당 표시 할 개체 수를 얻은 작은 래퍼 함수를 작성한 다음 object_list
을 호출 할 수 있습니다. django.core.paginator.Paginator
의 인스턴스 :
def paginated_object_list(request, page):
my_queryset=MyModel.objects.all()
#Here's T. Stone's code to get the number of items per page
try:
per_page = int(request.REQUEST['p'])
except:
per_page = 25 # default value
return object_list(request, queryset=my_queryset,
paginate_by=per_page, page=page)
그런 다음 템플릿의 컨텍스트,
paginator
를 변수를 포함합니다.page_obj
:django.core.paginator.Page
의 인스턴스입니다.
당신은 page_obj
을 통해 루프는 해당 페이지의 개체를 표시 할 수 있습니다.
무엇이 필요합니까? 잘.
페이지 번호 블록과 같이 change_list.html에 대한 사용자 지정 컨트롤을 추가 할 수 있습니다.
이것은 특정 값 변경 이벤트와 함께 예를 들어 get 파라미터 per_page과 함께 다시로드 목록 페이지가됩니다.
adminModel의 경우, changelist_view 메소드를 대체해야합니다. 여기서 get 매개 변수를 처리하고이 값을 list_per_page 필드 값으로 설정해야합니다.
def changelist_view(self, request):
if request.GET.get('per_page') and int(
request.GET.get('per_page')) in CHANGELIST_PERPAGE_LIMITS:
self.list_per_page = int(request.GET.get('per_page'))
else:
self.list_per_page = 100
extra_context = {'changelist_perpage_limits': CHANGELIST_PERPAGE_LIMITS,
'list_per_page': self.list_per_page}
return super(mymodelAdmin, self).changelist_view(request, extra_context)
이 값을 템플릿에 액세스하려면 extra_context를 사용합니다.어쩌면 거기에 액세스 할 수있는 깔끔한 접근 방식이 있습니다 :-)
감사 ... 이것은 정확히 내가 무엇을 찾고 있었는지 –
내가 어떻게하는지 모르겠다는 것을 깨달았습니다 ... 페이지 당 레코드 설정이 잘 작동합니다. 두 번째 페이지로 이동하면 페이지 수가 기본값으로 되돌아갑니다. –
try/except 대신에 접근 자 메소드를 사용하고 기본값을 제공합니다.'per_page = int (request.REQUEST.get ('p', 25))' – Marshall