From 54d50ef5c890242a8516346ea9ab97092c3fa8c1 Mon Sep 17 00:00:00 2001 From: Gary Wilson Jr Date: Wed, 2 Jul 2008 04:31:28 +0000 Subject: [PATCH] Made legacy `ObjectPaginator` truly backwards-compatible by catching both `AttributeError` and `TypeError` in `_get_count` as it did before [7306]. Tests included. git-svn-id: http://code.djangoproject.com/svn/django/trunk@7819 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/core/paginator.py | 5 ++++- tests/modeltests/pagination/models.py | 23 +++++++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/django/core/paginator.py b/django/core/paginator.py index 04cc4bf481..5fc6c80812 100644 --- a/django/core/paginator.py +++ b/django/core/paginator.py @@ -173,7 +173,10 @@ class ObjectPaginator(Paginator): if self._count is None: try: self._count = self.object_list.count() - except TypeError: + except (AttributeError, TypeError): + # AttributeError if object_list has no count() method. + # TypeError if object_list.count() requires arguments + # (i.e. is of type list). self._count = len(self.object_list) return self._count count = property(_get_count) diff --git a/tests/modeltests/pagination/models.py b/tests/modeltests/pagination/models.py index 277c5961e3..1f08a32903 100644 --- a/tests/modeltests/pagination/models.py +++ b/tests/modeltests/pagination/models.py @@ -200,6 +200,29 @@ InvalidPage: ... >>> paginator.page_range [1] +# ObjectPaginator can be passed lists too. +>>> paginator = ObjectPaginator([1, 2, 3], 5) +>>> paginator.hits +3 +>>> paginator.pages +1 +>>> paginator.page_range +[1] + + +# ObjectPaginator can be passed other objects with a count() method. +>>> class Container: +... def __len__(self): +... return 42 +>>> paginator = ObjectPaginator(Container(), 10) +>>> paginator.hits +42 +>>> paginator.pages +5 +>>> paginator.page_range +[1, 2, 3, 4, 5] + + ################## # Orphan support # ##################