1 | diff --git a/django/views/generic/list_detail.py b/django/views/generic/list_detail.py
|
---|
2 | index 1e39c4d..8c9baf6 100644
|
---|
3 | --- a/django/views/generic/list_detail.py
|
---|
4 | +++ b/django/views/generic/list_detail.py
|
---|
5 | @@ -45,6 +45,15 @@ def object_list(request, queryset, paginate_by=None, page=None,
|
---|
6 | if extra_context is None: extra_context = {}
|
---|
7 | queryset = queryset._clone()
|
---|
8 | if paginate_by:
|
---|
9 | +
|
---|
10 | + try:
|
---|
11 | + paginate_by = int(paginate_by)
|
---|
12 | + if paginate_by < 1:
|
---|
13 | + # page sizes less than one don't make sense
|
---|
14 | + raise Http404
|
---|
15 | + except ValueError:
|
---|
16 | + raise Http404
|
---|
17 | +
|
---|
18 | paginator = Paginator(queryset, paginate_by, allow_empty_first_page=allow_empty)
|
---|
19 | if not page:
|
---|
20 | page = request.GET.get('page', 1)
|
---|
21 | diff --git a/tests/regressiontests/views/tests/generic/object_list.py b/tests/regressiontests/views/tests/generic/object_list.py
|
---|
22 | index 6b1fed0..fecc37a 100644
|
---|
23 | --- a/tests/regressiontests/views/tests/generic/object_list.py
|
---|
24 | +++ b/tests/regressiontests/views/tests/generic/object_list.py
|
---|
25 | @@ -17,22 +17,43 @@ class ObjectListTest(TestCase):
|
---|
26 | return response
|
---|
27 |
|
---|
28 | def test_finds_pages(self):
|
---|
29 | - ""
|
---|
30 | + """
|
---|
31 | + Test object_list pagination page values
|
---|
32 | + """
|
---|
33 |
|
---|
34 | - # check page count doesn't start at 0
|
---|
35 | - response = self.check_pagination('/views/object_list/page0/', 404)
|
---|
36 | + base_url = '/views/object_list/paginate_by2/page%s/'
|
---|
37 |
|
---|
38 | - response = self.check_pagination('/views/object_list/page/', 200, )
|
---|
39 | - response = self.check_pagination('/views/object_list/page1/', 200, 2)
|
---|
40 | - response = self.check_pagination('/views/object_list/page2/', 200, 1)
|
---|
41 | - response = self.check_pagination('/views/object_list/pagelast/', 200, 1)
|
---|
42 | - response = self.check_pagination('/views/object_list/pagenotlast/', 404)
|
---|
43 | + # Check valid pagination requests.
|
---|
44 | + self.check_pagination(base_url % '', 200, )
|
---|
45 | + self.check_pagination(base_url % 1, 200, 2)
|
---|
46 | + self.check_pagination(base_url % 2, 200, 1)
|
---|
47 |
|
---|
48 | - response = self.check_pagination('/views/object_list/page3/', 404)
|
---|
49 | + # test 'last' special case
|
---|
50 | + self.check_pagination(base_url % 'last', 200, 1)
|
---|
51 |
|
---|
52 | + # Check for page numbers higher than maximum and invalid
|
---|
53 | + self.check_pagination(base_url % 'notlast', 404)
|
---|
54 | + self.check_pagination(base_url % 3, 404)
|
---|
55 | + self.check_pagination(base_url % -1, 404)
|
---|
56 | + # check page count doesn't start at 0
|
---|
57 | + self.check_pagination(base_url % 0, 404)
|
---|
58 |
|
---|
59 | - def test_no_paginate_by(self):
|
---|
60 | + def test_paginate_by(self):
|
---|
61 | + """
|
---|
62 | + Test object_list paginate_by values.
|
---|
63 | + """
|
---|
64 | +
|
---|
65 | + base_url = '/views/object_list/paginate_by%s/page1/'
|
---|
66 |
|
---|
67 | - response = self.check_pagination('/views/object_list_no_paginate_by/page1/', 200)
|
---|
68 | +
|
---|
69 | + response = self.check_pagination(base_url % 1, 200)
|
---|
70 | + self.assertEqual(response.context['is_paginated'], True)
|
---|
71 | +
|
---|
72 | + # Test when pagination is None
|
---|
73 | + response = self.check_pagination(base_url % '', 200)
|
---|
74 | self.assertEqual(response.context['is_paginated'], False)
|
---|
75 | -
|
---|
76 | \ No newline at end of file
|
---|
77 | +
|
---|
78 | + # Test invalid pagination values.
|
---|
79 | + self.check_pagination(base_url % 'spam', 404)
|
---|
80 | + self.check_pagination(base_url % -1, 404)
|
---|
81 | + self.check_pagination(base_url % 0, 404)
|
---|
82 | \ No newline at end of file
|
---|
83 | diff --git a/tests/regressiontests/views/urls.py b/tests/regressiontests/views/urls.py
|
---|
84 | index 9cf821c..70300c4 100644
|
---|
85 | --- a/tests/regressiontests/views/urls.py
|
---|
86 | +++ b/tests/regressiontests/views/urls.py
|
---|
87 | @@ -34,7 +34,6 @@ date_based_info_dict = {
|
---|
88 |
|
---|
89 | object_list_dict = {
|
---|
90 | 'queryset': Article.objects.all(),
|
---|
91 | - 'paginate_by' : 2,
|
---|
92 | }
|
---|
93 |
|
---|
94 | object_list_no_paginate_by = {
|
---|
95 | @@ -116,8 +115,8 @@ urlpatterns += patterns('django.views.generic.create_update',
|
---|
96 | )
|
---|
97 |
|
---|
98 | urlpatterns += patterns('django.views.generic.list_detail',
|
---|
99 | - (r'^object_list/page(?P<page>[\w]*)/$', 'object_list', object_list_dict),
|
---|
100 | - (r'^object_list_no_paginate_by/page(?P<page>[0-9]+)/$', 'object_list', object_list_no_paginate_by),
|
---|
101 | + (r'^object_list/paginate_by(?P<paginate_by>[-\w]*)/page(?P<page>[-\w]*)/$',
|
---|
102 | + 'object_list', object_list_dict),
|
---|
103 | )
|
---|
104 |
|
---|
105 | # a view that raises an exception for the debug view
|
---|