2016-02-29 49 views
4

我試圖用Django Endless Pagination實現PF Twitter的/ Instagram的風格分頁,其中,一旦用戶滾動到頁面的底部,然後新的內容被加載到頁面的效果。使用上述模塊,我已經能夠做到這一點。但是,我有一個性能相關的問題。我從哪裏發送數據的視圖仍會加載數據庫中的所有行。只有在模板方面,它的一部分被顯示。Django的懶加載分頁

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分貝調用中要訪問的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 %} 
+1

理想情況下,您會以這樣的方式編寫數據庫查詢,以便您通過一次調用檢索視圖所需的所有項目。以下情況_(需要訪問的50個項目/ 50分貝呼叫)_是一個惡夢場景! – Alexander

+0

@alex對不起。這句話的框架是錯誤的。我正在做1分貝的電話以獲得500件物品。但是,一旦我得到這500個項目,我做了大量的處理。這是花費時間,因此頁面加載緩慢。我想要的是,在1分貝呼叫中,獲得50個項目,處理它們,將它們發送到模板。然後,一旦用戶滾動到html頁面的底部,我再次調用db以獲取接下來的50個項目,處理它們並將它們發送回模板。我希望我現在清楚。 – Why

回答

1

Django的阿賈克斯將允許你做的Ajax調用Django視圖。您可以將結果包裝在一個列表中,然後將其緩存。從最初渲染視圖時,只需彈出前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頁面上。這是爲了較小的結果大小。對於更大的結果,你可能想使用類似於光標的東西。