Opened 8 years ago

Closed 6 years ago

#9195 closed Bug (fixed)

Paginator.page() should raise PageNotAnInteger when given a NoneType value

Reported by: thomas@… Owned by: nobody
Component: Documentation Version: 1.0
Severity: Normal Keywords:
Cc: Triage Stage: Accepted
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description

The documentation suggests that Paginator.page() raises PageNotAnInteger for non-integer values, however passing it None raises a TypeError. I would imagine this is a fairly common use case. If a URL optionally has a search string that specifies a page number (eg. ?page=3) you would want to pass request.GET.get('page') to Paginator.page. However, if the request lacks the search string, page() should logically return the PageNotAnInteger exception.

>>> from django.core.paginator import Paginator
>>> objects = ['john', 'paul', 'george', 'ringo']
>>> p = Paginator(objects, 2)
>>> p.page(1)
<Page 1 of 2>
>>> p.page("Pete Best")
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/home2/ether2/webapps/migration/lib/python2.5/django/core/paginator.py", line 37, in page
    number = self.validate_number(number)
  File "/home2/ether2/webapps/migration/lib/python2.5/django/core/paginator.py", line 25, in validate_number
    raise PageNotAnInteger('That page number is not an integer')
PageNotAnInteger: That page number is not an integer
>>> p.page(None)
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/home2/ether2/webapps/migration/lib/python2.5/django/core/paginator.py", line 37, in page
    number = self.validate_number(number)
  File "/home2/ether2/webapps/migration/lib/python2.5/django/core/paginator.py", line 23, in validate_number
    number = int(number)
TypeError: int() argument must be a string or a number, not 'NoneType'

Change History (7)

comment:1 Changed 8 years ago by Karen Tracey

Triage Stage: UnreviewedDesign decision needed

I'm not sure this is such a common thing, I think it is more likely that programmers have protected against 'page' not being in the search string by specifying a sensible default on the get, e.g. request.GET.get('page', 1). Technically changing the exception raised would be backwards-incompatible (though I doubt anyone has written code that depends on this behavior...still, it's impossible to know for sure). I'd be inclined to adjust the doc instead of the code to address this.

comment:2 Changed 8 years ago by (none)

milestone: post-1.0

Milestone post-1.0 deleted

comment:3 Changed 8 years ago by Thejaswi Puthraya

Component: UncategorizedCore framework

comment:4 Changed 6 years ago by Julien Phalip

Component: Core frameworkDocumentation

I agree with Karen and therefore change the component of this ticket to address this case in the documentation.

comment:5 Changed 6 years ago by Gabriel Hurley

Triage Stage: Design decision neededAccepted

Bumping to accepted from DDN. Correcting this in the docs is fine with me.

comment:6 Changed 6 years ago by Luke Plant

Severity: Normal
Type: Bug

comment:7 Changed 6 years ago by Horst Gutmann <zerok@…>

Easy pickings: unset
Resolution: fixed
Status: newclosed
UI/UX: unset

This was already addressed by SmileyChris in [16026] with a change to the Paginator.validate_number method which now raises a PageNotAnInteger exception on ValueError as well as on TypeError.

Note: See TracTickets for help on using tickets.
Back to Top