您的位置:首页 > 编程语言 > Go语言

django分页技术django-pagination和Paginator(基础篇)

2015-01-09 18:57 387 查看
转载前还请注明出处:http://blog.csdn.net/gugugujiawei

一、概述

几乎所有的web应用,都需要分页功能,但分页技术总体来说分两种,一种是全部加载,存于浏览器的缓存中,一种是分页访问,部分加载。前一种方法优点是实现简单,在一些对条目要求不多的特定应用上用得较多,可以利用的插件譬如datatables,而后一种方法优点是不会占用浏览器器太多的缓存,对于数据量大的列表项必须用到这种技术。由于我现在的项目属于管理后台,管理来自成千上万用户的数据,因而只能用到第二种方法。初期开发的时候没想那么多,直接用datatables插件就搞定了(datatables插件是个不错的插件哦,改进之应该可以用在第二种方法中)。

二、django的分页部分加载

在最开始的调研中,想利用boostrap Paginator,不过感觉不是很好用,优点是网上资源多,想做得很炫可以考虑一下。之后发现django-pagination。

1、django-pagination

这是一个python包,来自github上的一个项目,很容易用。参考/article/5633105.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的作用就体现在这里了。当然我是受/article/7764401.html启发,第一次加载才查找整个数据库,也是挺好的啦~

其实在写这个分页栏时,一直在思考一个问题:怎样复用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' %}方法如果这时如果有一个传参的功能多好。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: