2012-04-12 4 views
1

Я использую django-haystack и хочу переопределить функцию build_page(). вот URL-адрес build_page(). Я хочу заменить стандартный django paginator на django-paginator. спасибо alot :-)override haystack build_page() function

def build_page(self): 
    """ 
    Paginates the results appropriately. 

    In case someone does not want to use Django's built-in pagination, it 
    should be a simple matter to override this method to do what they would 
    like. 
    """ 

Я написал грязный код. Вы, пожалуйста, поможете мне? благодаря

class MyView(SearchView): 
    def build_page(self): 
    build_page = super(MyView, self).build_page() 
    page = self.results 
    return page 

ответ

0

Я сделал эту работу, используя Джанго-чисто-пагинацию

urls.py

from haystack.views import SearchView, search_view_factory 
from haystack.forms import SearchForm 
from myproj.myapp.views import CustomSearchView 

urlpatterns += patterns('haystack.views', 
    url(r'^buscar/$', search_view_factory(
     view_class=CustomSearchView, 
     template='myapp/obj_list.html', 
     form_class=SearchForm 
    ), name='haystack_search'), 
) 

views.py

from haystack.views import SearchView 
from pure_pagination import Paginator, EmptyPage, PageNotAnInteger 
from django.conf import settings 


class CustomSearchView(SearchView): 
    def __name__(self): 
     return "CustomSearchView" 

    def extra_context(self): 
     extra = super(CustomSearchView, self).extra_context() 

     try: 
      page = self.request.GET.get('page', 1) 
     except PageNotAnInteger: 
      page = 1 

     RESULTS_PER_PAGE = getattr(settings, 'HAYSTACK_SEARCH_RESULTS_PER_PAGE', 20) 
     p = Paginator(self.results, RESULTS_PER_PAGE, request=self.request) 
     pag = p.page(page) 
     extra['page_obj'] = pag 

     # important, to make haystack results compatible with my other templates 
     extra['myobj_list'] = [i.object for i in pag.object_list] 

     return extra 
1

Я использовал django-haystack с django-pure-pagination. Все, что вам нужно сделать, чтобы заставить Pagination работать, - это переопределить метод build_page из Haystacks SearchView и render объект Page.

urls.py

from core.views import ModifiedSearchView 

urlpatterns = patterns('', 
    url(r'^search/', ModifiedSearchView(), name='haystack_search'), 
) 

views.py

from haystack.views import SearchView 
from pure_pagination.paginator import Paginator 
from django.http import Http404 

class ModifiedSearchView(SearchView): 
    def build_page(self): 
     try: 
      page_no = int(self.request.GET.get('page', 1)) 
     except (TypeError, ValueError): 
      raise Http404("Not a valid number for page.") 

     if page_no < 1: 
      raise Http404("Pages should be 1 or greater.") 

     paginator = Paginator(self.results, self.results_per_page, request=self.request) 
     page = paginator.page(page_no) 

     return (paginator, page) 

search.html

{{ page.render }} 

или

{% include "pagination.html" with page_obj=page %} 

pagination.html

Чтобы изменить рендеринг по умолчанию (например, если вы используете загрузчик), самый простой способ, чтобы скопировать pagination.html шаблон, который поставляется в комплекте с django-pure-pagination пакетом в каталог шаблонов и включает в себя pagination.html, как показано выше.

+0

Я протестировал это решение на Haystack 2.0.0, и я могу подтвердить, что он работает. Спасибо, eli. –