builtin pagination now handles errors and converts them to Http404s
authorMichael Elsdoerfer <michael@elsdoerfer.info>
Sun, 21 Sep 2008 18:58:11 +0000 (20:58 +0200)
committerMichael Elsdoerfer <michael@elsdoerfer.info>
Sun, 21 Sep 2008 18:58:11 +0000 (20:58 +0200)
django_tables/tables.py
tests/test_basic.py

index b7035c7ccc530ff58e67c2613ba737530acf1909..f4fea4fcd8a9645fd53ab979a20fddcb9e5746d4 100644 (file)
@@ -1,4 +1,6 @@
 import copy\r
+from django.http import Http404\r
+from django.core import paginator\r
 from django.utils.datastructures import SortedDict\r
 from django.utils.encoding import StrAndUnicode\r
 from django.utils.text import capfirst\r
@@ -376,7 +378,10 @@ class BaseTable(object):
     def paginate(self, klass, *args, **kwargs):\r
         page = kwargs.pop('page', 1)\r
         self.paginator = klass(self.rows, *args, **kwargs)\r
-        self.page = self.paginator.page(page)\r
+        try:\r
+            self.page = self.paginator.page(page)\r
+        except paginator.InvalidPage, e:\r
+            raise Http404(str(e))\r
 \r
 \r
 class Table(BaseTable):\r
index 5b4e65a63a0641cd5539e38bd8ebd70a53084eac..51f897229cdb6ead0446548abde414ca18071e22 100644 (file)
@@ -6,6 +6,7 @@ This includes the core, as well as static data, non-model tables.
 from math import sqrt\r
 from nose.tools import assert_raises\r
 from django.core.paginator import Paginator\r
+from django.http import Http404\r
 import django_tables as tables\r
 \r
 def test_declaration():\r
@@ -304,6 +305,10 @@ def test_pagination():
     assert books.paginator.num_pages == 10\r
     assert books.page.has_previous() == False\r
     assert books.page.has_next() == True\r
+    # exceptions are converted into 404s\r
+    assert_raises(Http404, books.paginate, Paginator, 10, page=9999)\r
+    assert_raises(Http404, books.paginate, Paginator, 10, page="abc")\r
+    \r
 \r
 # TODO: all the column stuff might warrant it's own test file\r
 def test_columns():\r