Django 延迟加载分页
Django Lazy Loading 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' 个项目会从数据库访问,当滚动发生时会有另一个数据库调用等等,这可以提高页面的加载性能。假设页面中有 1000 个项目,那么理想情况下我希望先加载 50 个项目(在 1 个数据库调用中访问 50 个项目),然后一旦用户滚动并到达页面底部,然后再加载 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 %}
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 页面上有更详细的说明。这是为了较小的结果大小。不过,为了获得更大的结果,您可能需要使用游标之类的东西。
我正在尝试使用 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' 个项目会从数据库访问,当滚动发生时会有另一个数据库调用等等,这可以提高页面的加载性能。假设页面中有 1000 个项目,那么理想情况下我希望先加载 50 个项目(在 1 个数据库调用中访问 50 个项目),然后一旦用户滚动并到达页面底部,然后再加载 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 %}
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 页面上有更详细的说明。这是为了较小的结果大小。不过,为了获得更大的结果,您可能需要使用游标之类的东西。