2009-11-06 61 views
9

Xin chào mọi người!Hiển thị các mục trang đếm trong phân trang django

Tôi đang cố gắng tìm ra cách hiển thị nội dung như "Hiển thị 1-10 của 52" bằng cách sử dụng phân trang django trong các mẫu của tôi.

Tôi tự hoàn thành việc phân trang nhưng không có gì liên quan đến tâm trí của tôi về yêu cầu này. Bất kỳ ý tưởng nào?

Trả lời

37

Không biết tại sao mọi người lại phức tạp như vậy. Như the documentation hiển thị, tất cả các thuộc tính này đã có sẵn.

Đối tượng paginator có thuộc tính count hiển thị tổng số đối tượng trên tất cả các trang và Page đối tượng có các thuộc tính start_indexend_index.

Vì vậy, giả sử bạn vượt qua page vào mẫu bối cảnh:

{{ page.start_index }} to {{ page.end_index }} of {{ page.paginator.count }}. 
+0

whoa! đây chính là điều tôi đang tìm kiếm. cảm ơn! – webgonewild

+1

Điều này rất hữu ích - cảm ơn. Chỉ lưu ý rằng tôi sẽ có là mặc định trong một 'ListView' đối tượng được gọi là' page_obj' thay vì 'page'. – BigglesZX

0
totalPages = math.ceil(float(totalRecords)/recordsPerPage) 

hoặc

paginatorInstance.num_pages # this is there by default 

Chẳng phải là khó, phải không?

1

Đối tượng django Paginator có thuộc tính num_pages. Theo quan điểm của bạn, bạn chỉ có thể chuyển dữ liệu chính xác vào mẫu của bạn và hiển thị nó ở đó.

Vì vậy, như một (thô) ví dụ:

xem

current_page = ## input param 
items_per_page = 10 
paginator = Paginator(result, items_per_page)  

... 
return render_to_response('template.html', 
    { 
    'num_pages': paginator.num_pages, 
    'start_count': items_per_page * current_page + 1, 
    'end_count': (items_per_page * current_page + 1) + len(paginator(current_page).object_list) 
    'items_per_page': items_per_page 
    } 

mẫu

showing {{start_count} - {{end_count}} of {{num_pages}} 

(tôi đã viết mã này mà không có sự lợi ích của một trình biên dịch, vì vậy thử nghiệm nó)

+0

chỉ cần gửi paginator để mẫu và sau đó truy cập vào thuộc tính pagintator như: {{offers.previous_page_number}}, {{offers.next_page_number}}, {{offers.paginator.count}} – gerpaick

3

Bạn sẽ cần phải làm gì đó phức tạp hơn đằng sau hậu trường. Và xin lưu ý rằng trong khi tôi là một dev python, tôi đã sử dụng werkzeug và jinja2 trong một thời gian dài bây giờ và do đó cú pháp django của tôi là một chút gỉ. Ngoài ra điều này đã được mã hóa khô (như trong tôi chỉ cần gõ nó ở đây trong trình duyệt) và cần được kiểm tra để đảm bảo rằng nó hoạt động như dự định.

Nói chung tôi sẽ tạo đối tượng phân trang và chuyển đối tượng đó vào đối tượng truy vấn không được lọc theo trang, bạn cũng có thể cho biết số trang trên mỗi trang và trang bạn đang truy cập.

Vì vậy, một cái gì đó mơ hồ tương tự như:

Paginator(query, objects_per_page, current_page_number) 

Và sau đó vượt qua các kết quả đối tượng paginator vào mẫu.

Bên init của paginator bạn muốn làm điều gì đó tương tự như:

def __init__(self, query, objects_per_page, current_page_number): 
    self.total = query.count() 

    self.per_page = objects_per_page 
    self.current_page_number = current_page_number 
    self.lower_limit = objects_per_page * current_page_number 
    self.upper_limit = objects_per_page * (current_page_number + 1) 

    if self.upper_limit > self.total: 
     self.upper_limit = self.total 

    self.objects = query[self.lower_limit - 1:self.upper_limit - 1] 

Sau đó, trong mẫu mà bạn muốn làm điều gì đó như

Showing {{paginator.lower_limit}}-{{paginator.upper_limit}} of {{paginator.total}} 

Và sau khi bạn đã sẵn sàng để lặp qua các đối tượng bạn chỉ có thể lặp qua paginator.objects.

Tôi hy vọng cung cấp cho bạn ý tưởng chung về cách bạn có thể làm điều này một cách rõ ràng.

+0

Peharps của nó tốt hơn để phân lớp được xây dựng trong django.core.paginator.Paginator lớp để thêm các thuộc tính lower_limit và upper_limit. – webgonewild

+0

Rất có thể, tôi đã không sử dụng django trong một thời gian yên tĩnh. Ngoài ra các num_pages có vẻ là một stat không hợp lệ từ nơi tôi ngồi. Bạn có vẻ muốn tổng số đối tượng, không phải tổng số trang, có thể có một giải pháp khác cho điều đó tuy nhiên trong trình dịch của django. –

Các vấn đề liên quan