2

阅读django-endless-pagination的文档它说你可以通过使用@page_template()装饰器将它的Ajax分页功能扩展到基于类的视图。 。 我一直在尝试使用以实施装饰的像一小时:使用django-endless-pagination自定义基于扩展ListView的基于c的视图

class ExtendedListView(ListView): 
    template_name = 'global_template.html' 

    @method_decorator(@page_template('path_to_updatable_content_only_template')) 
    def dispatch(self, *args, **kwargs): 
     return super(ExtendedListView, self).dispatch(*args, **kwargs) 

视图功能不输出任何错误,但是当我去到另一个网页加载目标中的“global_template”和不是在装饰器中定义的模板。

如果有人知道这个实现是否真正起作用,并且我犯了一些错误,请指出,我很乐意以正确的方式使用它。

我已经设法拿出一个workarround所以如果someoene的得到了同样的问题,有没有标准的答案,这一点,你可以这样做:

class ExtendedListView(ListView): 
    template_name='global_template_path' 

    ''' 
    render_to_response ¿hack? so that i can render only the updatable DOM part template 
    ''' 
    def render_to_response(self, context): 
     if self.request.is_ajax(): 
      self.template_name = 'path_to_updatable_content_only_template' 
      return super(ExtendedListView, self).render_to_response(context) 
     else: 
      return super(ExtendedListView, self).render_to_response(context) 

干杯!

回答

3

正式,你可以使用AjaxListView做这个任务:

# views.py 
from endless_pagination.views import AjaxListView  
class BookView(AjaxListView): 
    context_object_name = "books" 
    model = Book 

    template_name = 'books.html' 
    page_template = 'books_list.html' 

在book.html:

{% extends 'base.html' %} 


{% block js %} 
    {{ block.super }} 
    <script src="/static/js/jquery.js" type="text/javascript" charset="utf-8"></script> 
    <script src="/static/js/endless.js" type="text/javascript" charset="utf-8"></script> 
{% endblock %} 

{% block content %} 

<div class="endless_page_template"> 

    {% include page_template %} 
</div> 

{% endblock %} 

,这是books_list.html

{% load endless %} 

{% paginate books %} 

{% for book in books %} 
    {{ book.title }} 
{% endfor %} 

<div class="pagination"> 

    {% show_pages %} 
</div> 
+0

我的问题是试图让多个分页工作。 – acjay 2012-09-26 22:06:20

1

它实际上相当令人费解的Ajax实现如何工作。我必须推出我自己的解决方案,因为我想使用通用视图,Ajax和多个分页。为了弄清楚如何使它工作,我必须对示例中的代码,django-endless-pagination装饰器和Django的视图本身进行逆向工程。在滚动我自己的解决方案的过程中,我简化了一些东西,但可能会进一步简化。也许这可能是对别人有用:

class SearchView(View): 
    """ 
    Based on code from django-endless-pagination, modified for multiple 
    pagination views on the same page 
    """ 

    template = 'app/search.html' 
    page_templates = {'object1Page': 'app/search_object1_pane.html', 
    'object2Page': 'app/search_object2_pane.html'} 

    def get_context_data_and_template(self, **kwargs): 
     context = {'params': kwargs} 

     # Check whether AJAX has made a request, if so, querystring_key will be 
     # set, identifying which paginator to render 
     querystringKey = self.request.REQUEST.get('querystring_key') 
     template = self.page_templates.get(querystringKey) 
     # switch template on ajax requests 
     if not (self.request.is_ajax() and template): 
      template = self.template  
     context['page_template'] = template 

     # Always generate the QuerySets that will be paginated 
     if self.request.GET['query']: 
      searchTerm = self.request.GET['query'] 
     else: 
      searchTerm = kwargs['search'] 

     # *** Insert your search code here *** 

     context['object1Results'] = object1QuerySet 
     context['object2Results'] = object2QuerySet 

     extraContext = self.kwargs.get("extra_context", {}) 
     context.update(extraContext) 

     return context, template 

    def get(self, request, *args, **kwargs): 
     context, template = self.get_context_data_and_template(**kwargs) 
     return TemplateResponse(request=self.request, 
      template=template, 
      context=context)