一、django-pure-pagination分页
github上的描述(django-pure-pagination provides advanced pagination features and is fully compatible with existing code based on Django's core pagination module. (aka no need to rewrite code!)),意思就是说Django-pure-pagination是基于Django的核心分页模型上开发出来,更好地去开发,当然目标是唯一的,但工具是多样的,只要实现目标,那么也是可以的。如果Bootstrap(衣服)会的也可以用Bootstrap实现分页的效果图。
要求:
Django 1.7+
1、在自己开发项目环境(虚拟环境下安装包):
pip install django-pure-pagination
或者从github上将源码克隆下来(这样可以使用最新的功能啦):
git clone git@github.com:jamespacileo/django-pure-pagination.git cd django-pure-pagination python setup.py install
2、安装好环境那么去Django项目中配置settings中的INSTALL_APPS里注册pure-pagination:
INSTALLED_APPS = ( ... 'pure_pagination', )
3、接下来注册完就可以使用啦,去到视图中导入模板并查询相关数据分页:
from pure_pagination import Paginator,EmptyPage,PageNotAnInteger
def get(self,request): all_teachers = Teacher.objects.all() # 对老师列表进行分页 try: #取出页码值,如果没有页码值默认为1 page = request.GET.get("page", 1) #如果是字符串的话也是默认为1 except PageNotAnInteger: page = 1 #对从数据库查出来的所有对象以10个记录作为一页返回Paginator对象 p = Paginator(all_teachers, 10, request=request) #对象有page方法参数是页数,返回的是对象列表和当前的页数 teachers = p.page(page) #将每一页数据传入然后由模板渲染 return render(request,"teachers-list.html",{ "all_teachers":teachers,})
Paginator对象初始化:
def __init__(self, object_list, per_page, orphans=0, allow_empty_first_page=True, request=None):
4、对模板的数据写入:
<div class="butler_list layout"> <div class="head"> <ul class="fl tab_header"> <li {% if sort == "" %}class="active"{% endif %}><a href="?sort=">全部</a> </li> <li {% if sort == "hot" %}class="active"{% endif %}><a href="?sort=hot">人气 ↓</a></li> </ul> <div class="fr butler-num">共<span class="key">{{ all_teachers|wordcount }}</span>人 </div> </div> {#all_teachers.object_list这是每一条记录的遍历,all_teachers是Paginator对象的page方法,方法返回值object_list与number,然而object_list#}
{#是每一页的所有记录,因此需要用Paginator.page对象去遍历出每条记录#} {% for teacher in all_teachers.object_list %} <dl class="des"> <dt> <a href="{% url "org:teacher_detail" teacher.id %}"> <div class="picpic"> <img width="100" height="100" class="scrollLoading" src="{{ MEDIA_URL }}{{ teacher.image }}"/> </div> </a> <div class="btn"> <div class="fr btn2 bdsharebuttonbox" data-text="授课教师-{{ teacher.name }}-慕学在线" data-desc="{{ teacher.points }}" data-comment="{{ teacher.name }}金牌讲师,从业年限:{{ teacher.work_years }}年" > <span class="fl">分享</span> <a href="#" class="bds_more" data-cmd="more"></a> </div> </div> </dt> <dd> <a href="{% url "org:teacher_detail" teacher.id %}"> <h1>{{ teacher.name }}<span class="key picbig">金牌讲师</span></h1> </a> <ul class="cont"> <li>工作年限:<span>{{ teacher.work_years }}年</span></li> <li>工作职位:<span>{{ teacher.work_position }}</span></li> <li>就职公司:<span>{{ teacher.work_company }} </span></li> <li>年龄:<span>{{ teacher.age }}岁</span></li> <li>教学特点:<span>{{ teacher.points }}</span></li> </ul> </dd> <a class="buy buyservice" href="{% url "org:teacher_detail" teacher.id %}"><br/>查看<br/>详情</a> </dl> {% endfor %} </div>
5、模板页码操作:
<div class="pageturn"> <ul class="pagelist"> {% if all_teachers.has_previous %} <li class="long"><a href="?{{ all_teachers.previous_page_number.querystring }}">上一页</a></li> {% endif %} {% for page in all_teachers.pages %} {% if page %}
//all_teachers的方法number就是有Paginator对象的page方法传回 {% ifequal page all_teachers.number %} <li class="active"><a href="?{{ page.querystring }}">{{ page }}</a></li> {% else %} <li><a href="?{{ page.querystring }}" class="page">{{ page }}</a></li> {% endifequal %} {% else %} <li class="none"><a href="">...</a></li> {% endif %} {% endfor %} {% if all_teachers.has_next %} <li class="long"><a href="?{{ all_teachers.next_page_number.querystring }}">下一页</a></li> {% endif %} </ul> </div>