1 """ |
|
2 30. Object pagination |
|
3 |
|
4 Django provides a framework for paginating a list of objects in a few lines |
|
5 of code. This is often useful for dividing search results or long lists of |
|
6 objects into easily readable pages. |
|
7 """ |
|
8 |
|
9 from django.db import models |
|
10 |
|
11 class Article(models.Model): |
|
12 headline = models.CharField(maxlength=100, default='Default headline') |
|
13 pub_date = models.DateTimeField() |
|
14 |
|
15 def __str__(self): |
|
16 return self.headline |
|
17 |
|
18 __test__ = {'API_TESTS':""" |
|
19 # prepare a list of objects for pagination |
|
20 >>> from datetime import datetime |
|
21 >>> for x in range(1, 10): |
|
22 ... a = Article(headline='Article %s' % x, pub_date=datetime(2005, 7, 29)) |
|
23 ... a.save() |
|
24 |
|
25 # create a basic paginator, 5 articles per page |
|
26 >>> from django.core.paginator import ObjectPaginator, InvalidPage |
|
27 >>> paginator = ObjectPaginator(Article.objects.all(), 5) |
|
28 |
|
29 # the paginator knows how many hits and pages it contains |
|
30 >>> paginator.hits |
|
31 9 |
|
32 |
|
33 >>> paginator.pages |
|
34 2 |
|
35 |
|
36 # get the first page (zero-based) |
|
37 >>> paginator.get_page(0) |
|
38 [<Article: Article 1>, <Article: Article 2>, <Article: Article 3>, <Article: Article 4>, <Article: Article 5>] |
|
39 |
|
40 # get the second page |
|
41 >>> paginator.get_page(1) |
|
42 [<Article: Article 6>, <Article: Article 7>, <Article: Article 8>, <Article: Article 9>] |
|
43 |
|
44 # does the first page have a next or previous page? |
|
45 >>> paginator.has_next_page(0) |
|
46 True |
|
47 |
|
48 >>> paginator.has_previous_page(0) |
|
49 False |
|
50 |
|
51 # check the second page |
|
52 >>> paginator.has_next_page(1) |
|
53 False |
|
54 |
|
55 >>> paginator.has_previous_page(1) |
|
56 True |
|
57 |
|
58 >>> paginator.first_on_page(0) |
|
59 1 |
|
60 >>> paginator.first_on_page(1) |
|
61 6 |
|
62 >>> paginator.last_on_page(0) |
|
63 5 |
|
64 >>> paginator.last_on_page(1) |
|
65 9 |
|
66 |
|
67 # Add a few more records to test out the orphans feature. |
|
68 >>> for x in range(10, 13): |
|
69 ... Article(headline="Article %s" % x, pub_date=datetime(2006, 10, 6)).save() |
|
70 |
|
71 # With orphans set to 3 and 10 items per page, we should get all 12 items on a single page: |
|
72 >>> paginator = ObjectPaginator(Article.objects.all(), 10, orphans=3) |
|
73 >>> paginator.pages |
|
74 1 |
|
75 |
|
76 # With orphans only set to 1, we should get two pages: |
|
77 >>> paginator = ObjectPaginator(Article.objects.all(), 10, orphans=1) |
|
78 >>> paginator.pages |
|
79 2 |
|
80 """} |
|