From a4832f53b911a85a3a7589b0ee3dfec77ea6c8a6 Mon Sep 17 00:00:00 2001 From: floguy Date: Mon, 30 Mar 2009 06:38:08 +0000 Subject: [PATCH] Fixed a problem where the middleware accessed POST on every request, freezing upload_handlers at that point. git-svn-id: https://django-pagination.googlecode.com/svn/trunk@49 7f1efe38-554e-0410-b69d-834cb44da2d5 --- docs/usage.txt | 10 ++++++++++ pagination/middleware.py | 15 +++++++++++---- pagination/tests.py | 29 ++++++++++++++--------------- 3 files changed, 35 insertions(+), 19 deletions(-) diff --git a/docs/usage.txt b/docs/usage.txt index 9c97c51..b520169 100644 --- a/docs/usage.txt +++ b/docs/usage.txt @@ -70,6 +70,16 @@ That's it! You have now paginated ``object_list`` and given users of the site a way to navigate between the different pages--all without touching your views. +A Note About Uploads +-------------------- + +It is important, when using django-pagination in conjunction with file uploads, +to be aware of when ``request.page`` is accessed. As soon as ``request.page`` +is accessed, ``request.upload_handlers`` is frozen and cannot be altered in any +way. It's a good idea to access the ``page`` attribute on the request object +as late as possible in your views. + + Optional Settings ------------------ diff --git a/pagination/middleware.py b/pagination/middleware.py index 5e917c5..f8a2a6f 100644 --- a/pagination/middleware.py +++ b/pagination/middleware.py @@ -1,10 +1,17 @@ +def get_page(self): + """ + A function which will be monkeypatched onto the request to get the current + integer representing the current page. + """ + try: + return int(self.REQUEST['page']) + except (KeyError, ValueError, TypeError): + return 1 + class PaginationMiddleware(object): """ Inserts a variable representing the current page onto the request object if it exists in either **GET** or **POST** portions of the request. """ def process_request(self, request): - try: - request.page = int(request.REQUEST['page']) - except (KeyError, ValueError, TypeError): - request.page = 1 \ No newline at end of file + request.__class__.page = property(get_page) \ No newline at end of file diff --git a/pagination/tests.py b/pagination/tests.py index fadb870..a55ef49 100644 --- a/pagination/tests.py +++ b/pagination/tests.py @@ -30,32 +30,24 @@ >>> t = Template("{% load pagination_tags %}{% autopaginate var 2 %}{% paginate %}") -# WARNING: Please, please nobody read this portion of the code! ->>> class GetProxy(object): -... def __iter__(self): yield self.__dict__.__iter__ -... def copy(self): return self -... def urlencode(self): return u'' -... def keys(self): return [] ->>> class RequestProxy(object): +>>> from django.http import HttpRequest as DjangoHttpRequest +>>> class HttpRequest(DjangoHttpRequest): ... page = 1 -... GET = GetProxy() ->>> -# ENDWARNING ->>> t.render(Context({'var': range(21), 'request': RequestProxy()})) +>>> t.render(Context({'var': range(21), 'request': HttpRequest()})) u'\\n\\n