django分頁技術django-pagination和Paginator(基礎篇)

轉載前還請註明出處: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' %}方法如果這時如果有一個傳參的功能多好。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章