轉載前還請註明出處:http://blog.csdn.net/gugugujiawei
一、概述
幾乎所有的web應用,都需要分頁功能,但分頁技術總體來說分兩種,一種是全部加載,存於瀏覽器的緩存中,一種是分頁訪問,部分加載。前一種方法優點是實現簡單,在一些對條目要求不多的特定應用上用得較多,可以利用的插件譬如datatables,而後一種方法優點是不會佔用瀏覽器器太多的緩存,對於數據量大的列表項必須用到這種技術。由於我現在的項目屬於管理後臺,管理來自成千上萬用戶的數據,因而只能用到第二種方法。初期開發的時候沒想那麼多,直接用datatables插件就搞定了(datatables插件是個不錯的插件哦,改進之應該可以用在第二種方法中)。
二、django的分頁部分加載
在最開始的調研中,想利用boostrap Paginator,不過感覺不是很好用,優點是網上資源多,想做得很炫可以考慮一下。之後發現django-pagination。
1、django-pagination
這是一個python包,來自github上的一個項目,很容易用。參考http://www.cnblogs.com/bbcar/p/3521103.html
不過這是一個懶人工具,好吧(工具理性)。不過當一個頁面有多處需要採用分頁的話,就行不通了,要麼修改django-pagination的源碼,改變它的url指向,不過我沒研究,當工程涉及到遷移時,要知道要安裝各種東西本來就是個缺點,還要再修改源碼,那就得不償失。因而轉戰django自帶的分頁插件——Paginator。
2、Paginator
先看看效果
感覺還勉強可以吧。要更加牛X的功能自行Google咯。
views.py
#coding:utf-8
from django.shortcuts import render_to_response,RequestContext
from django.http import HttpResponse
from django.core.paginator import Paginator,EmptyPage,PageNotAnInteger
def middleware_review(req):
midware=[1,2,3]
midware_review=[1,2,3]
limit=10
page_midware=Paginator(midware,limit)
page_midware_review=Paginator(midware_review,limit)
page=req.GET.get('page')
table=req.GET.get('table','none')
try:
if table=='1':
midware=page_midware.page(page)
else:
midware=page_midware.page(1)
except PageNotAnInteger:
midware=page_midware.page(1)
except EmptyPage:
midware=page_midware.page(page_midware.num_pages)
try:
if table=='2':
midware_review=page_midware_review.page(page)
else:
midware_review=page_midware_review.page(1)
except PageNotAnInteger:
midware_review=page_midware_review.page(1)
except EmptyPage:
midware_review=page_midware_review.page(page_midware_review.num_pages)
return render_to_response('middleware-review.html',{'midware':midware,'midware_review':midware_review},context_instance=RequestContext(req))
table的作用是爲了區分同一個頁面不同的分頁。
my.html
取數據操作爲:
{% for u in midware.object_list %}
{% endfor %}
在需要插入分頁標籤的地方,插入代碼:
<div style="float:right">
{% include "pages/midware.html" %}
</div>
當然,這裏直接將midware.html原封不動搬過來也是可以的,不過爲了解耦,就另新建一個文件夾pages放分頁的html。
midware.html
<ul class="pagination">
{% if midware.has_previous %}
<li><a href="?table=1&&page={{ midware.previous_page_number }}" class="prev">{{ previous_link_decorator|safe }}上一頁</a></li>
{% else %}
<li class="paginate_button previous disabled"><span class="disabled prev">{{ previous_link_decorator|safe }}上一頁</span></li>
{% endif %}
{% for page in midware.paginator.page_range %}
{% if page %}
{% ifequal page midware.number %}
<li class="active"><span class="current page">{{ page }}</span></li>
{% else %}
<li><a href="?table=1&&page{{ page_suffix }}={{ page }}{{ getvars }}" class="page">{{ page }}</a></li>
{% endifequal %}
{% endif %}
{% endfor %}
{% if midware.has_next %}
<li><a href="?table=1&&page={{ midware.next_page_number }}" class="next">下一頁{{ next_link_decorator|safe }}</a></li>
{% else %}
<li class="paginate_button next disabled"><span class="disabled next">下一頁{{ next_link_decorator|safe }}</span></li>
{% endif %}
</ul>
table的作用就體現在這裏了。當然我是受http://blog.csdn.net/zgyulongfei/article/details/8842338啓發,第一次加載才查找整個數據庫,也是挺好的啦~
其實在寫這個分頁欄時,一直在思考一個問題:怎樣複用midware.html代碼,因爲這部分代碼只有兩個地方不一樣,一是從view傳過來的對象名,二是table值,大部分時間在弄這個,採取現在這種方法也是迫不得已。
嘗試過這些方法:
1、讀進去一個html文件,替換其中的字符串,如midware,table。試過document.write,innerHtml,$('#id').html()這些用於javascript與html文件的操作。大體思路是讀進一個文件字符串,或者一個DOM對象,然後利用replace,再write到一個div中或者調用$('#id').html()。
2、利用js文件,在js文件中格式已經是字符串的情況,當在my.html進行調用的時候,傳入js參數,再寫回my.html的div中,這種方法成功了。但終於發現問題的本質(感覺)——是不可能實現的。
因爲,當瀏覽器訪問django的時候,傳回html文件,再傳回{{}}和{% %}等東西,之後再調用javascript代碼,任何採用javascript代碼的操作都略顯遲。
因此最後只能每個分頁欄寫一個html,如果有誰有其他好方法還請不吝賜教哈。感覺如果django自帶的{% include 'html' %}方法如果這時如果有一個傳參的功能多好。