4

Я пытаюсь использовать Django Endless Pagination, чтобы добиться эффекта pg страницы разбиения на страницы в формате Twitter/Instagram, когда пользователь прокручивается в нижней части страницы, затем новое содержимое загружается на страницу. Используя вышеописанный модуль, я смог это сделать. Однако у меня есть вопрос, связанный с производительностью. Вид, откуда я отправляю данные, все еще загружает все строки из базы данных. Только на стороне шаблона отображается часть его.Django Lazy Loading Pagination

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 

Я думал, что только «п» число элементов будет доступ из базы данных, и когда прокрутки произойдет там будет еще один вызов дб и так далее, что может улучшить производительность загрузки страницы. Предположим, что на странице 1000 элементов, тогда в идеале я хотел бы, скажем, 50 элементов для загрузки сначала (50 элементов для доступа к вызову 1 дБ), а затем, когда пользователь прокручивается и доходит до нижней части страницы, а затем 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

В идеале вы должны написать свой запрос db таким образом, чтобы вы извлекали все элементы, которые необходимо просматривать с помощью одного вызова. Следующая ситуация: (50 пунктов для доступа/вызовы 50 дБ) _ - кошмарный сценарий! – Alexander

+0

@alex Извините. Внедрение предложения было неправильным. Я делаю вызов 1 дБ, чтобы получить, скажем, 500 пунктов. Однако, как только я получу 500 штук, я много обрабатываю их. Это занимает время, и, следовательно, страница медленно загружается. То, что я хочу, это то, что в вызове 1 дБ получите 50 элементов, обработайте их, отправьте их в шаблон. Затем, как только пользователь прокручивается до нижней части html-страницы, я делаю другой вызов db, чтобы получить следующие 50 элементов, обработать их и отправить обратно в шаблон. Надеюсь, теперь я поняла. – Why

ответ

1

Джанго Ajax позволит вам сделать 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 

Более подробная инструкция на странице Джанго АЯКС. Это для меньшего размера результата. Для больших результатов вы можете использовать что-то вроде курсора.