2009-11-13 2 views
2

페이지 매김을 구현하여 사용자가 10, 25, 50 등의 페이지 당 레코드 수를 선택할 수 있도록하고 싶습니다. 어떻게해야합니까? 내 프로젝트에 추가 할 수있는 앱이 있나요?Django의 유연한 페이지 매김

감사합니다 "장고 매김"및 확인에

답변

5

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'] 
+0

감사 ... 이것은 정확히 내가 무엇을 찾고 있었는지 –

+0

내가 어떻게하는지 모르겠다는 것을 깨달았습니다 ... 페이지 당 레코드 설정이 잘 작동합니다. 두 번째 페이지로 이동하면 페이지 수가 기본값으로 되돌아갑니다. –

+1

try/except 대신에 접근 자 메소드를 사용하고 기본값을 제공합니다.'per_page = int (request.REQUEST.get ('p', 25))' – Marshall

1

구글 효율적인 쿼리에 대한 SQL에 "커버링 인덱스"를 사용합니다.

0

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을 통해 루프는 해당 페이지의 개체를 표시 할 수 있습니다.

0

무엇이 필요합니까? 잘.

페이지 번호 블록과 같이 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를 사용합니다.어쩌면 거기에 액세스 할 수있는 깔끔한 접근 방식이 있습니다 :-)