fixed issue #14, patch from Martin Mahner
[django-pagination.git] / pagination / templatetags / pagination_tags.py
index 66d8640..499db41 100644 (file)
@@ -8,8 +8,9 @@ from django.core.paginator import Paginator, QuerySetPaginator, InvalidPage
 
 register = template.Library()
 
-DEFAULT_PAGINATION = 20
-DEFAULT_WINDOW = 4
+DEFAULT_PAGINATION = getattr(settings, 'PAGINATION_DEFAULT_PAGINATION', 20)
+DEFAULT_WINDOW = getattr(settings, 'PAGINATION_DEFAULT_WINDOW', 4)
+DEFAULT_ORPHANS = getattr(settings, 'PAGINATION_DEFAULT_ORPHANS', 0)
 
 def do_autopaginate(parser, token):
     """
@@ -24,6 +25,16 @@ def do_autopaginate(parser, token):
         except ValueError:
             raise template.TemplateSyntaxError(u'Got %s, but expected integer.' % split[2])
         return AutoPaginateNode(split[1], paginate_by=paginate_by)
+    elif len(split) == 4:
+        try:
+            paginate_by = int(split[2])
+        except ValueError:
+            raise template.TemplateSyntaxError(u'Got %s, but expected integer.' % split[2])
+        try:
+            orphans = int(split[3])
+        except ValueError:
+            raise template.TemplateSyntaxError(u'Got %s, but expected integer.' % split[3])           
+        return AutoPaginateNode(split[1], paginate_by=paginate_by, orphans=orphans)
     else:
         raise template.TemplateSyntaxError('%r tag takes one required argument and one optional argument' % split[0])
 
@@ -51,9 +62,10 @@ class AutoPaginateNode(template.Node):
         tag.  If you choose not to use *{% paginate %}*, make sure to display the
         list of availabale pages, or else the application may seem to be buggy.
     """
-    def __init__(self, queryset_var, paginate_by=DEFAULT_PAGINATION):
+    def __init__(self, queryset_var, paginate_by=DEFAULT_PAGINATION, orphans=DEFAULT_ORPHANS):
         self.queryset_var = template.Variable(queryset_var)
         self.paginate_by = paginate_by
+        self.orphans = orphans
 
     def render(self, context):
         key = self.queryset_var.var
@@ -68,10 +80,12 @@ class AutoPaginateNode(template.Node):
             except IndexError:
                 return u''
             paginator_class = Paginator
-        paginator = paginator_class(value, self.paginate_by)
+        paginator = paginator_class(value, self.paginate_by, self.orphans)
         try:
             page_obj = paginator.page(context['request'].page)
-        except:
+        except InvalidPage:
+            context[key] = []
+            context['invalid_page'] = True
             return u''
         context[key] = page_obj.object_list
         context['paginator'] = paginator
@@ -183,4 +197,4 @@ def paginate(context, window=DEFAULT_WINDOW):
     except KeyError:
         return {}
 register.inclusion_tag('pagination/pagination.html', takes_context=True)(paginate)
-register.tag('autopaginate', do_autopaginate)
\ No newline at end of file
+register.tag('autopaginate', do_autopaginate)