Django-haystack и django-pagination не работают вместе?

Я использую стог сена с whoosh и django 1.3. В моем URL у меня есть:

url(r'^search/', include('haystack.urls')),

Я создал собственный шаблон в приложении: search/seach.html:

{% if page.object_list %}                                                        

{% autopaginate page.object_list 3 %}
{% for arg in page.object_list %}
...
{% endfor%}
{% paginate %}

Мой поиск работает отлично! Также правильно отображается нумерация страниц (с шаблонным тегом paginate). Но когда я пытаюсь перейти на следующую страницу, я получаю эту ошибку:

Page not found (404)
Request Method:     GET
Request URL:    http://127.0.0.1:8000/search/?page=2&q=Aktualno%C5%9B%C4%87

Вы не могли бы мне помочь? Что случилось?


person user979432    schedule 07.07.2012    source источник


Ответы (3)


Я заставил работать django-haystack и django-pagination, используя собственный SearchView, который расширяет SearchView django-haystack. Просто закомментируйте или удалите (paginator, page) = self.build_page() и переменную контекста страницы и пагинатора.

Ниже мой пользовательский SearchView.

class SearchView(SearchView):

def create_response(self):
    """
    Generates the actual HttpResponse to send back to the user.
    """
    # (paginator, page) = self.build_page()

    context = {
        'query': self.query,
        'form': self.form,
        # 'page': page,
        # 'paginator': paginator,
        'suggestion': None,
        'results': self.results
    }

    if self.results and hasattr(self.results, 'query') and self.results.query.backend.include_spelling:
        context['suggestion'] = self.form.get_suggestion()

    context.update(self.extra_context())
    return render_to_response(self.template, context, context_instance=self.context_class(self.request))

и в шаблоне разбить на страницы, используя переменную контекста результатов:

  {% autopaginate results 2 %}
  {% for result in results %}
      {{ result.attribute }}
  {% endfor %}
  {% paginate %}

Вот и все :)

person John Kenn    schedule 01.11.2013

В Django 1.8.4 вам просто нужно заменить страницу на page_obj в вашем шаблоне.

Пример:

{% for arg in page_obj.object_list %}
person Rhemzo    schedule 12.10.2015

haystack SearchView по умолчанию page не поддерживает django-pagination. Если вы хотите использовать django-pagination, вы можете наследовать SearchView и добавить новую контекстную переменную для хранения результатов поиска. И затем вы можете использовать эту контекстную переменную для разбиения на страницы.

def create_response(self):
    (paginator, page) = self.build_page()        
    context = {
        'query': self.query,
        'form': self.form,
        'page': page,
        'results': self.results,
        'paginator': paginator,
        'suggestion': None,
        }
person risent    schedule 23.07.2012