def get(self, request, fmt=None): context = {} if fmt: query = '' results = EmptySearchQuerySet() form = self.form_class(request.GET, searchqueryset=self.searchqueryset, load_all=True) if form.is_valid(): print form.cleaned_data query = form.cleaned_data['q'] order_by = request.GET.get('order_by', None) results = form.search(order_by) else: results = form.no_query_found() if self.facets: for facet in self.facets: results = results.facet(facet[0], mincount=1, sort=facet[1]) context['facets'] = results.facet_counts() paginator = Paginator(results, 25) page = request.GET.get('page', '1') try: content = paginator.page(page) except PageNotAnInteger: content = paginator.page(1) except EmptyPage: content = paginator.page(paginator.num_pages) context['content'] = content context['paginator'] = paginator context['query'] = query context['form'] = form return self.render_to_format(request, context, self.template_name, fmt) else: params = [] if not request.GET.get('q') and not request.GET.get('order_by'): params.append('order_by={}'.format(self.default_order)) for param in self.params: print param['name'] param_value = request.GET.get(param['name'], param['default']) if param_value: params.append('{}={}'.format(param['name'], param_value)) print params context['params'] = '&'.join(params) context['status_code'] = 303 context['additional_headers'] = {'location': self.path} context['content'] = None return self.render(request, context, self.template_name)
def catalogue_search(request, template='search/search.html', load_all=True, form_class=CatalogueSearchForm, searchqueryset=None, extra_context=None, results_per_page=None): """ A more traditional view that also demonstrate an alternative way to use Haystack. Useful as an example of for basing heavily custom views off of. Also has the benefit of thread-safety, which the ``SearchView`` class may not be. Template:: ``search/search.html`` Context:: * form An instance of the ``form_class``. (default: ``ModelSearchForm``) * page The current page of search results. * paginator A paginator instance for the results. * query The query received by the form. """ query = '' results = EmptySearchQuerySet() results_per_page = results_per_page or RESULTS_PER_PAGE if request.GET.get('q'): form = form_class(request.GET, searchqueryset=searchqueryset, load_all=load_all) if form.is_valid(): query = form.cleaned_data['q'] results = form.search() else: form = form_class(searchqueryset=searchqueryset, load_all=load_all) results = results.facet('categories').facet('country').facet('has_images').facet('global_region').facet('item_name') if form.is_valid(): results = filter_with_facet(form, results, 'item_name', 'item_name') results = filter_with_facet(form, results, 'category', 'categories') results = filter_with_facet(form, results, 'global_region', 'global_region') results = filter_with_facet(form, results, 'country', 'country') if form.cleaned_data['person']: sqs = SearchQuerySet() for p in form.cleaned_data['person'].split(): term = sqs.query.clean(p) results = results.narrow(u'people:"%s"' % term) if form.cleaned_data['has_images'] == True: results = results.narrow(u'has_images_exact:true') facets = results.facet_counts() if facets: # Prepare the form with all the available facets load_facets_into_form(form, facets, 'item_name', 'item_name') load_facets_into_form(form, facets, 'category', 'categories') load_facets_into_form(form, facets, 'global_region', 'global_region') load_facets_into_form(form, facets, 'country', 'country') # Append count of images into form appended_count = False for name, val in facets['fields']['has_images']: if name == 'true': form.fields['has_images'].label += ' (%s)' % val appended_count = True if not appended_count: form.fields['has_images'].label += ' (0)' results = results.order_by('registration_number') paginator = Paginator(results, results_per_page) try: page = paginator.page(int(request.GET.get('page', 1))) except InvalidPage: raise Http404("No such page of results!") context = { 'form': form, 'page': page, 'paginator': paginator, 'query': query, 'suggestion': None, 'facets': facets, } # Store query for paging through results on item detail page if form.is_valid(): request.session['search_query'] = form.cleaned_data # Access the first result to prevent ZeroDivisionError if results: results[0] request.session['search_results'] = results request.session['search_results_per_page'] = results_per_page if getattr(settings, 'HAYSTACK_INCLUDE_SPELLING', False): context['suggestion'] = form.get_suggestion() if extra_context: context.update(extra_context) return render(request, template, context)