专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > Go

django分页技术django-pagination跟Paginator

发布时间:2011-06-29 18:25:42 文章来源:www.iduyao.cn 采编人员:星星草
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">       
<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' %}方法如果这时如果有一个传参的功能多好。


友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

  • ModernUI课程:定义一个Logo

    ModernUI教程:定义一个Logo ModernWindow的标题栏包含了一块区域用来显示自定义的窗体Logo: 这个窗体logo通过ModernWindow.LogoD...

  • Django忘记管理员账号和密码的解决方法

    Django忘记管理员账号和密码的解决办法 看着Django的教程学习搭建网站,结果忘记第一次创建的账号和密码了。结果搭建成功以后,一直...

  • GO语言小结(1)——基本知识

    GO语言总结(1)——基本知识 1、注释(与C++一样)   行注释://  块注释:/*   ...  */ 2、标识符   可以这么说,除了数字开头...

  • golang 惯用的文件读取方式

    golang 常用的文件读取方式 Golang 的文件读取方法很多,刚上手时不知道怎么选择,所以贴在此处便后速查。 一次性读取 小文件推荐一...

  • 查询深圳市通相关信息

    查询深圳通相关信息 用 HTTP.GET 从开放 API 中查询深圳通信息,然后将 JSON 数据存入结构体中,再格式化输出。 注意:获取的并不是实...

  • Go语言设计模式实践:结合(Composite)

    Go语言设计模式实践:组合(Composite) 关于本系列 这个系列首先是关于Go语言实践的。在项目中实际使用Go语言也有段时间了,一个体会就...

  • 列出索引和遍历目录

    列出目录和遍历目录 获取目录列表用 ioutil.ReadDir(),遍历目录用 filepath.Walk(),使用方法请参考文章示例。 示例代码: package ma...

  • io 包的惯用接口速记

    io 包的常用接口速记 我没有 C/C++ 基础,没有接口的概念,且从 Python 投奔而来,Python 的极简主义(一个结果往往只提供一个方法),让我在...

  • 代理服务扩充

    代理服务扩展 之前自己实现了一个代理服务,当时考虑的是只要支持SOCKS5就好了,因为我经常用CHROME,配合着SwitchySharp,体验还是很棒...

  • 文件的创造与打开

    文件的创建与打开 文件操作是个很重要的话题,使用也非常频繁,熟悉如何操作文件是必不可少的。Golang 对文件的支持是在 os package ...

热门推荐: