Django Lazy Loading Pagination

时间:2016-02-29 14:13:13

标签: jquery python django pagination django-endless-pagination

我正在尝试使用Django Endless Pagination来实现Twitter / Instagram风格分页的效果,其中一旦用户滚动到页面的底部,则将新内容加载到页面上。使用上面的模块,我已经能够这样做。但是,我有一个与性能相关的问题。我发送数据的视图仍然从数据库中加载所有行。仅在模板侧,显示其中的一部分。

class IndexView(BaseAjaxViewList):
    template_name = 'polls/index.html'
    page_template = 'polls/item_index.html'
    context_object_name = 'data'
    model = Question

    def get_context_data(self,**kwargs):
        context = super(IndexView, self).get_context_data(**kwargs)
        print(len(context["data"]))
        return context

我认为只有'n'个项目可以从数据库访问,当滚动发生时会有另一个db调用等等,这可以提高页面的加载性能。假设页面中有1000个项目,那么理想情况下我想要首先加载项目(50个项目在1 db调用中访问)然后一旦用户滚动并到达页面底部然后接下来50个项目应访问和显示项目。但是,我试图检查场景下面,似乎所有1000次调用都是使用此模块一次完成的。仅在模板侧,一次显示50个。这是真的?有没有任何django模块可以做到这一点,或者我必须编写自己的ajax调用等?

参考模板如下:

主模板

 <h2>Polls:</h2>
    {% include page_template %}

    {% block js %}
        {{ block.super }}
        <script src="http://code.jquery.com/jquery-latest.js"></script>
        <script src="{% static 'endless_pagination/js/endless-pagination.js' %}"></script>
        <script>$.endlessPaginate();</script>
    {% endblock %}

page_template

{% load endless %}

{% paginate entries %}
{% for entry in entries %}
    {# your code to show the entry #}
{% endfor %}
{% show_more %}

1 个答案:

答案 0 :(得分:1)

Django Ajax允许您对Django视图进行Ajax调用。您可以将结果包装在列表中,然后缓存该结果。从那里开始渲染视图时,只需弹出前50个(或任何您想要设置的大小)。然后在Ajax调用上弹出缓存。

类似的东西:

@django_ajax
def paginated_cache(request):
    more_results = [cache.get('your_results').pop() for result in range(50)]
    # turn this to json, wrap in dictionary and return

更详细的说明在django ajax页面上。这是为了更小的结果大小。为了获得更大的结果,您可能希望使用类似光标的东西。