Skip to content

Commit 3c38f00

Browse files
committed
Changed SearchView to allow more control over how many results are shown per page. Thanks to simonw for the suggestion.
1 parent b16729f commit 3c38f00

File tree

4 files changed

+39
-8
lines changed

4 files changed

+39
-8
lines changed

docs/views_and_forms.rst

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -129,8 +129,8 @@ The functional view provides an example of how Haystack can be used in more
129129
traditional settings or as an example of how to write a more complex custom
130130
view. It is also thread-safe.
131131

132-
``SearchView(template=None, load_all=True, form_class=ModelSearchForm, searchqueryset=None, context_class=RequestContext)``
133-
---------------------------------------------------------------------------------------------------------------------------
132+
``SearchView(template=None, load_all=True, form_class=ModelSearchForm, searchqueryset=None, context_class=RequestContext, results_per_page=None)``
133+
--------------------------------------------------------------------------------------------------------------------------------------------------
134134

135135
The ``SearchView`` is designed to be easy/flexible enough to override common
136136
changes as well as being internally abstracted so that only altering a specific
@@ -241,8 +241,8 @@ creates the context and renders the response for all the aforementioned
241241
processing.
242242

243243

244-
``basic_search(request, template='search/search.html', load_all=True, form_class=ModelSearchForm, searchqueryset=None, context_class=RequestContext, extra_context=None)``
245-
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------
244+
``basic_search(request, template='search/search.html', load_all=True, form_class=ModelSearchForm, searchqueryset=None, context_class=RequestContext, extra_context=None, results_per_page=None)``
245+
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
246246

247247
The ``basic_search`` tries to provide most of the same functionality as the
248248
class-based views but resembles a more traditional generic view. It's both a

haystack/views.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,17 @@ class SearchView(object):
1717
results = EmptySearchQuerySet()
1818
request = None
1919
form = None
20+
results_per_page = RESULTS_PER_PAGE
2021

21-
def __init__(self, template=None, load_all=True, form_class=ModelSearchForm, searchqueryset=None, context_class=RequestContext):
22+
def __init__(self, template=None, load_all=True, form_class=ModelSearchForm, searchqueryset=None, context_class=RequestContext, results_per_page=None):
2223
self.load_all = load_all
2324
self.form_class = form_class
2425
self.context_class = context_class
2526
self.searchqueryset = searchqueryset
2627

28+
if not results_per_page is None:
29+
self.results_per_page = results_per_page
30+
2731
if template:
2832
self.template = template
2933

@@ -93,7 +97,7 @@ def build_page(self):
9397
should be a simple matter to override this method to do what they would
9498
like.
9599
"""
96-
paginator = Paginator(self.results, RESULTS_PER_PAGE)
100+
paginator = Paginator(self.results, self.results_per_page)
97101

98102
try:
99103
page = paginator.page(self.request.GET.get('page', 1))
@@ -142,7 +146,7 @@ def extra_context(self):
142146
return extra
143147

144148

145-
def basic_search(request, template='search/search.html', load_all=True, form_class=ModelSearchForm, searchqueryset=None, context_class=RequestContext, extra_context=None):
149+
def basic_search(request, template='search/search.html', load_all=True, form_class=ModelSearchForm, searchqueryset=None, context_class=RequestContext, extra_context=None, results_per_page=None):
146150
"""
147151
A more traditional view that also demonstrate an alternative
148152
way to use Haystack.
@@ -175,7 +179,7 @@ def basic_search(request, template='search/search.html', load_all=True, form_cla
175179
else:
176180
form = form_class(searchqueryset=searchqueryset, load_all=load_all)
177181

178-
paginator = Paginator(results, RESULTS_PER_PAGE)
182+
paginator = Paginator(results, results_per_page or RESULTS_PER_PAGE)
179183

180184
try:
181185
page = paginator.page(int(request.GET.get('page', 1)))
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
from django.conf.urls.defaults import *
2+
from haystack.views import SearchView
3+
4+
5+
class CustomPerPage(SearchView):
6+
results_per_page = 1
7+
8+
9+
urlpatterns = patterns('haystack.views',
10+
url(r'^search/$', CustomPerPage(load_all=False), name='haystack_search'),
11+
url(r'^search2/$', CustomPerPage(load_all=False, results_per_page=2), name='haystack_search'),
12+
)

tests/core/tests/views.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,21 @@ def __call__(self, request):
100100
self.assertNotEqual(foo, bar)
101101

102102

103+
class ResultsPerPageTestCase(TestCase):
104+
urls = 'core.tests.results_per_page_urls'
105+
106+
def test_custom_results_per_page(self):
107+
response = self.client.get('/search/', {'q': 'hello world'})
108+
self.assertEqual(response.status_code, 200)
109+
self.assertEqual(len(response.context[-1]['page'].object_list), 1)
110+
self.assertEqual(response.context[-1]['paginator'].per_page, 1)
111+
112+
response = self.client.get('/search2/', {'q': 'hello world'})
113+
self.assertEqual(response.status_code, 200)
114+
self.assertEqual(len(response.context[-1]['page'].object_list), 1)
115+
self.assertEqual(response.context[-1]['paginator'].per_page, 2)
116+
117+
103118
class FacetedSearchViewTestCase(TestCase):
104119
def setUp(self):
105120
super(FacetedSearchViewTestCase, self).setUp()

0 commit comments

Comments
 (0)