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‘ %}方法如果这时如果有一个传参的功能多好。

时间: 2024-10-25 07:53:03

django分页技术django-pagination和Paginator的相关文章

django分页技术paginator

分页是Web应用常用的手法,Django提供了一个分页器类Paginator(django.core.paginator.Paginator),可以很容易的实现分页的功能.该类有两个构造参数,一个是数据的集合,另一个是每页放多少条数据. 分页对象Paginator: 只需提供两个必要的参数,第一个就是用于展示的数据(object_list),第二参数就是每页显示的大小(per_page),提供了这两个参数,其他的都好说: Paginator.count:数据总量 Paginator.num_pa

django分页技术Paginator(进阶篇)

一.概述 在之前的另一篇博文中介绍了在django中进行分页的两种方法,可是说基本上实现了分页刷新的功能,但存留一个问题,那就是当页数多的时候,会出现所有页码排开的情况,美观性不好不说,更主要的是当页码多的时候,分页栏会变得很长.所以对之前的做法进行重构的同时,也实现了定义分页栏显示页码个数的功能. 最终效果: 本博文旨在深化理解Paginator的使用,当然熟悉后也可以实现"跳转","下5页"类似的功能. 二.Paginator 博文提到,在一个页面中使用多个表,

Django 分页2 (Pagination)

分页是Web应用常用的手法,Django提供了一个分页器类Paginator(django.core.paginator.Paginator),可以很容易的实现分页的功能.该类有两个构造参数,一个是数据的集合,另一个是每页放多少条数据.Paginator的基本使用如下: $python manage.py shell >>> from django.core.paginator import Paginator >>> objects = ['john', 'paul'

django分页功能,templatetags的应用

django 将不会将得到的html代码自动转化 from django.utils.html import format_html html =''' <a href='http://www.china.cn'>中国</a>''' format_html(html) django分页 分页功能基本操作 from django.core.import Paginator li=[11,12,13,22,24,25] p=Paginator(li,3) #将li传入,每页显示3条 p

django 分页组件

一.仿django分页功能自己实现 urls.py 1 2 3 4 5 6 7 8 9 from django.conf.urls import url from django.contrib import admin from app01 import views urlpatterns = [     url(r'^admin/', admin.site.urls),     url(r'^index.html$', views.index),     ] views.py 1 2 3 4

Cookie、Session和Django分页

cookie Cookie的由来 大家都知道HTTP协议是无状态的. 无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不会直接影响后面的请求响应情况. 一句有意思的话来描述就是人生只如初见,对服务器来说,每次的请求都是全新的. 状态可以理解为客户端和服务器在某次会话中产生的数据,那无状态的就以为这些数据不会被保留.会话中产生的数据又是我们需要保存的,也就是说要“保持状态”.因此cookie就是在这样一个场景下诞生.

django 分页例子

django 分页例子 安装 python3.6 -m pip install django-pure-pagination==0.3.0 设置 settings.py INSTALLED_APPS = [ 'pure_pagination', ] PAGINATION_SETTINGS = { 'PAGE_RANGE_DISPLAYED': 3, 'MARGIN_PAGES_DISPLAYED': 2, 'SHOW_FIRST_PAGE_WHEN_INVALID': True, } DISPL

Django框架(十五)—— Django分页组件

Django分页组件 一.分页器 数据量大的话,可以分页获取,查看 例如:图书管理中,如果有成千上万本书,要是都在一个页面中渲染出来,会影响页面美观,所以就要用分页器分页渲染 二.分页器的使用 基本写法 基本写法: 后端: 总数据拿出来 生成分页器Paginator对象(对象里有属性和方法) 生成当前页的对象,current_page=paginator.page(当前页码) 取出前台传过来的页码,current_page_num = int(request.GET.get('page')) -

8.2 Django 分页组件替换自定义分页

Django的分页器(paginator) 总之不太好用我们还是用自己的好一些 自定义分页器 分页实现源码 """ 自定义分页组件 """ class Pagination(object): def __init__(self, current_page, all_count, base_url, params, per_page_num=8, pager_count=11, ): """ 封装分页相关数据 :par