转载前还请注明出处: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"> <span style="white-space:pre"> </span>{% 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 %} {% else %} <li>...</li> {% 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‘ %}方法如果这时如果有一个传参的功能多好。