2012-12-18 23 views
5

Tôi đang cố gắng để chuyển tiếp và phân trang ngược lại hoạt động cho truy vấn tôi có trên ứng dụng của mình.Phân trang với con trỏ ngược trong appengine

Tôi đã bắt đầu với ví dụ tại địa chỉ: https://developers.google.com/appengine/docs/python/ndb/queries#cursors

Tôi mong chờ ví dụ đó để làm một tiền đạo điển hình/quay pagination để tạo ra con trỏ mà bạn có thể vượt qua cho mẫu của bạn để được sử dụng trong một yêu cầu tiếp theo cho trang sau/trước trang hiện tại. Nhưng những gì nó đang làm là nhận được con trỏ cho cùng một trang, một từ đầu và khác từ cuối (nếu tôi đã hiểu một cách chính xác).

Điều tôi muốn là con trỏ ở đầu trang sau và con trỏ đến đầu trang trước, để sử dụng trong giao diện người dùng của tôi.

Tôi đã cố gắng gần như nhận được rằng với đoạn mã sau, dựa trên các ví dụ được đề cập:

curs = Cursor(urlsafe=self.request.get('cur')) 

    q = MyModel.query(MyModel.usett == usett_key) 
    q_forward = q.order(-MyModel.sugerida) 
    q_reverse = q.order(MyModel.sugerida) 

    ofus, next_curs, more = q_forward.fetch_page(num_items_page, 
               start_cursor=curs) 

    rev_cursor = curs.reversed() 
    ofus1, prev_curs, more1 = q_reverse.fetch_page(num_items_page, 
               start_cursor=rev_cursor) 

    context = {} 

    if more and next_curs: 
     context['next_curs'] = next_curs.urlsafe() 

    if more1 and prev_curs: 
     context['prev_curs'] = prev_curs.reversed().urlsafe() 

Vấn đề, và điểm của câu hỏi này, là tôi sử dụng moremore1 để xem nếu có trang tiếp theo. Và điều đó không có ý nghĩa ngược lại. Đối với trang đầu tiên, more1True, trong trang thứ hai more1False và các trang tiếp theo cung cấp True.

Tôi cần một thứ cung cấp False cho trang đầu tiên và True cho mọi trang khác. Có vẻ như giá trị trả về more này là điều cần sử dụng, nhưng có thể tôi có thiết lập Truy vấn không đúng hoặc bất kỳ điều gì khác không đúng.

Cảm ơn tất cả mọi người!

Chỉnh sửa: Vì tôi không tìm thấy giải pháp đơn giản cho điều này, tôi đã chuyển sang sử dụng ndbpager.

Trả lời

2

Không có thứ gì như vậy. Bạn biết thats theres (ít nhất) một trang trước trang hiện tại nếu bạn bắt đầu truy vấn bằng con trỏ (trang đầu tiên thường có dosnt có con trỏ). Bí quyết phổ biến để truy cập trang trước là đảo ngược thứ tự sắp xếp.

Nếu bạn có danh sách, được sắp xếp theo creationdate desc, bạn có thể tạo phần tử tạo thành phần đầu tiên của trang hiện tại của mình, truy vấn các thành phần với creationdate < tạo kết quả này bằng cách sử dụng thứ tự sắp xếp ngược. Điều này sẽ trả lại các phần tử cũ nhất mới hơn sau đó là tạo ra được tạo. Lật danh sách các phần tử được thử lại (để đưa chúng vào đúng thứ tự một lần nữa) và ở đó bạn có các phần tử của trang trước đó mà không cần sử dụng con trỏ.

Lưu ý: điều này yêu cầu các giá trị phân loại ong của bạn khác biệt.

Trong một số trường hợp, cũng có thể sử dụng chỉ mục dựng sẵn cho phép truy cập ngẫu nhiên vào các trang khác nhau, xem https://bitbucket.org/viur/server/src/98de79b91778bb9b16e520acb28e257b21091790/indexes.py để biết thêm.

+0

Có trường hợp khi trang đầu tiên được truy vấn bằng con trỏ, ví dụ: khi bạn chuyển đến trang 2 và quay lại trang 1, bạn sẽ có trang 1 với con trỏ. Và nếu bạn phụ thuộc vào điều đó, bạn sẽ ở trang 1 cho thấy có một trang trước chỉ vì bạn có con trỏ. – payala

+0

Làm cách nào để bạn tạo con trỏ trỏ trước Element đầu tiên của Danh sách? Ive đã thử nó, nhưng tôi chỉ có thể tạo con trỏ sau khi tìm nạp ít nhất một phần tử - và cho phép con trỏ trỏ * sau * phần tử này (Vì vậy truy vấn sử dụng con trỏ này sẽ luôn mất phần tử đầu tiên này) –

+0

Tôi nhận con trỏ đó sau khi chạy truy vấn trên truy vấn đảo ngược thứ tự. Trên thực tế, bạn nói đúng, tôi hoàn toàn không nhận được con trỏ trỏ trước phần tử đầu tiên, tôi nhận được con trỏ ở đâu đó sau phần tử đầu tiên trong truy vấn ngược, tương ứng với phần tử gần cuối truy vấn chuyển tiếp . Vì vậy, bạn có được ảo tưởng rằng nó là trước yếu tố đầu tiên nếu bạn nghĩ rằng danh sách là hình tròn, nhưng nó không phải là. Có lẽ, điều này có thể được giải quyết nếu tôi bắt đầu truy vấn cung cấp một con trỏ đến phần tử đầu tiên của truy vấn chuyển tiếp, nhưng tôi không biết cách thực hiện điều đó. – payala

-1

Tôi có giải pháp thay thế và không phải là giải pháp tốt nhất. nó được chuyển hướng trở lại trang trước.

<a href="javascript:history.back()">Previous</a> 

Tôi nghĩ PagedQuery có khả năng nhưng vẫn đang chờ ai đó đăng bài hướng dẫn toàn diện hơn về nó.

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