django高级应用(分页功能)

django高级应用(分页功能)

1、原生分页应用

前端html代码

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Title</title>
 6 </head>
 7 <body>
 8     <ul>
 9         {% for item in posts.object_list %}
10             <li>{{ item.name }}- {{ item.age }}</li>
11         {% endfor %}
12     </ul>
13     {% include ‘include/pages.html‘ %}
14 </body>
15 </html>
16
17
18 #include/pages.html
19
20 {% if posts.has_previous %}
21     <a href="/index1.html?p={{ posts.previous_page_number }}">上一页</a>
22 {% else %}
23     <a href="#">上一页</a>
24 {% endif %}
25
26 {% if posts.has_next %}
27     <a href="/index1.html?p={{ posts.next_page_number }}">下一页</a>
28 {% endif %}
29 <span>
30     {{ posts.number }}/{{ posts.paginator.num_pages }}
31 </span>

前端html代码

django后台代码

 1 from django.shortcuts import render
 2 from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
 3
 4 USER_LIST = []
 5 for i in range(1, 999):
 6     temp = {‘name‘: ‘root‘ + str(i), ‘age‘: i}
 7     USER_LIST.append(temp)
 8
 9 def index1(request):
10     # 全部数据:USER_LIST,=》得出共有多少条数据
11     # per_page: 每页显示条目数量
12     # count:    数据总个数
13     # num_pages:总页数
14     # page_range:总页数的索引范围,如: (1,10),(1,200)
15     # page:     page对象(是否具有下一页;是否有上一页;)
16     current_page = request.GET.get(‘p‘)
17     # Paginator对象
18     paginator = Paginator(USER_LIST, 10)
19     #paginator = CustemPaginator(current_page, 11, USER_LIST, 10)
20     try:
21         posts = paginator.page(current_page)
22         # has_next              是否有下一页
23         # next_page_number      下一页页码
24         # has_previous          是否有上一页
25         # previous_page_number  上一页页码
26         # object_list           分页之后的数据列表,已经切片好的数据
27         # number                当前页
28         # paginator             paginator对象
29     except PageNotAnInteger:
30         posts = paginator.page(1)
31     except EmptyPage:
32         posts = paginator.page(paginator.num_pages)
33     return render(request, "index1.html", {"posts": posts})
34
35 django后台代码

django后台代码

缺点:功能少,例如显示页面范围等。

2、自定制添加显示页面范围的功能

 1 {% if posts.has_previous %}
 2     <a href="/index1.html?p={{ posts.previous_page_number }}">上一页</a>
 3 {% else %}
 4     <a href="#">上一页</a>
 5 {% endif %}
 6
 7 {% for i in posts.paginator.page_num_range %}
 8     {% if i == posts.number %}
 9         <a style="font-size: 20px" href="/index1.html?p={{ i }}">{{ i }}</a>
10     {% else %}
11         <a href="/index1.html?p={{ i }}">{{ i }}</a>
12     {% endif %}
13 {% endfor %}
14
15 {% if posts.has_next %}
16     <a href="/index1.html?p={{ posts.next_page_number }}">下一页</a>
17 {% endif %}
18 <span>
19     {{ posts.number }}/{{ posts.paginator.num_pages }}
20 </span>

前端html代码

django后台代码

 1 from django.shortcuts import render
 2 from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
 3
 4 USER_LIST = []
 5 for i in range(1, 999):
 6     temp = {‘name‘: ‘root‘ + str(i), ‘age‘: i}
 7     USER_LIST.append(temp)
 8
 9 class CustemPaginator(Paginator):
10     """
11     是自定制django分页类的方法
12     :page_num_range 显示返回页数范围
13     :current_page  当前页数
14     :max_page_num 最大显示的页码数
15     """
16     def __init__(self, current_page, max_pager_num, *args, **kwargs):
17         # 当前页
18         self.current_page = int(current_page)
19         # 最多显示的页码数量
20         self.max_pager_num = int(max_pager_num)
21         super(CustemPaginator,self).__init__(*args, **kwargs)
22
23     def page_num_range(self):
24         # 当前页
25         # self.current_page
26         # 最多显示的页码数量 11
27         # self.per_pager_num
28         # 总页数
29         # self.num_pages
30
31         # 判断如果页面总数量小于显示页面的总数量,那么返回最大的页面总数量。
32         if self.num_pages < self.max_pager_num:
33             return range(1, self.num_pages + 1)
34         part = int(self.max_pager_num / 2)
35
36         # 判断当前页小于等于最大显示页的一半,那么返回1到最大显示页数量。
37         if self.current_page <= part:
38             return range(1, self.max_pager_num + 1)
39
40         # 当选择页数加上显示页数的一半的时候,说明越界了,例如最大也数是15,显示页数是10,我选择11页,那么11+5等于16,大于15,那么就显示总页数15-11+1,15+1
41         if (self.current_page + part) > self.num_pages:
42             # 那么返回总页数前去当前显示页数个数+1的值,和总页数+1的值。
43             return range(self.num_pages - self.max_pager_num + 1, self.num_pages + 1)
44
45         # 当选择页大于当前总页数的一半的时候,返回当前选择页的前五个和后五个页数。
46         return range(self.current_page - part, self.current_page + part + 1)
47
48
49 def index1(request):
50     # 全部数据:USER_LIST,=》得出共有多少条数据
51     # per_page: 每页显示条目数量
52     # count:    数据总个数
53     # num_pages:总页数
54     # page_range:总页数的索引范围,如: (1,10),(1,200)
55     # page:     page对象(是否具有下一页;是否有上一页;)
56     current_page = request.GET.get(‘p‘)
57     # Paginator对象
58     # paginator = Paginator(USER_LIST, 10)
59     paginator = CustemPaginator(current_page, 11, USER_LIST, 10)
60     try:
61         posts = paginator.page(current_page)
62         # has_next              是否有下一页
63         # next_page_number      下一页页码
64         # has_previous          是否有上一页
65         # previous_page_number  上一页页码
66         # object_list           分页之后的数据列表,已经切片好的数据
67         # number                当前页
68         # paginator             paginator对象
69     except PageNotAnInteger:
70         posts = paginator.page(1)
71     except EmptyPage:
72         posts = paginator.page(paginator.num_pages)
73     return render(request, "index1.html", {"posts": posts})

django后台代码

3、自定制分页模块

  1 # -*- coding: utf-8 -*-
  2 # @Time    : 2017/7/4
  3 # @Author  : Ocean.Pan
  4
  5 class Pagination(object):
  6     def __init__(self,current_page,total_page_count,per_page_item_num=10,max_page_num=7,page_url=None):
  7         # 当前页
  8         self.current_page = current_page
  9         try:
 10             v = int(current_page)
 11             if v <= 0:
 12                 v = 1
 13             self.current_page = v
 14         except Exception as e:
 15             self.current_page = 1
 16         # 数据总个数
 17         self.total_page_count = total_page_count
 18         # 每一页显示的页面元素个数
 19         self.per_page_item_num = per_page_item_num
 20         # 最大显示页码
 21         self.max_page_num = max_page_num
 22         self.page_url = page_url
 23
 24     def start_page_item(self):
 25         ‘‘‘
 26         开始显示的页面元素,即从第几个页面链接开始显示
 27         :return: 当前页减一乘以每个页面最多显示元素个数
 28         ‘‘‘
 29         return (self.current_page-1) * self.per_page_item_num
 30
 31     def end_page_item(self):
 32         ‘‘‘
 33         结束显示的页面元素,即最后一个页面元素的显示
 34         :return: 当前页乘以每个页面显示的最大元素个数
 35         ‘‘‘
 36         return self.current_page * self.per_page_item_num
 37
 38     # @property 是让num_pages变成以静态属性方式访问。
 39     @property
 40     def num_pages(self):
 41         ‘‘‘
 42         总页码数量
 43         :return: 当b为零的时候代表是可整除的,a就是返回值,当不能整除时a+1返回。
 44         ‘‘‘
 45         a,b = divmod(self.total_page_count,self.per_page_item_num)
 46         if b == 0:
 47             return a
 48         return a+1
 49
 50     def page_num_range(self):
 51         ‘‘‘
 52         页码的显示范围
 53         :return:
 54         ‘‘‘
 55
 56         # 判断如果页面总数量小于显示页面的总数量,那么返回最大的页面总数量。
 57         if self.num_pages < self.max_page_num:
 58             return range(1, self.max_page_num + 1)
 59         part = int(self.max_page_num / 2)
 60
 61         # 判断当前页小于等于最大显示页的一半,那么返回1到最大显示页数量。
 62         if self.current_page <= part:
 63             return range(1, self.max_page_num + 1)
 64
 65         # 当选择页数加上显示页数的一半的时候,说明越界了,例如最大也数是15,显示页数是10,我选择11页,那么11+5等于16,大于15,那么就显示总页数15-11+1,15+1
 66         if (self.current_page + part) > self.num_pages:
 67             # 那么返回总页数前去当前显示页数个数+1的值,和总页数+1的值。
 68             return range(self.num_pages - self.max_page_num + 1, self.num_pages + 1)
 69
 70         # 当选择页大于当前总页数的一半的时候,返回当前选择页的前五个和后五个页数。
 71         return range(self.current_page - part, self.current_page + part + 1)
 72
 73     def page_str(self):
 74         page_list=[]
 75         first = "<li><a href=‘/%s?p=1‘>首页</a></li>" % (self.page_url,)
 76         page_list.append(first)
 77
 78         if self.current_page == 1:
 79             prev = "<li><a href=‘#‘>上一页</a></li>"
 80         else:
 81             prev = "<li><a href=‘/%s?p=%s‘>上一页</a></li>" % (self.page_url,self.current_page - 1)
 82         page_list.append(prev)
 83
 84         for i in self.page_num_range():
 85             if i == self.current_page:
 86                 temp = "<li class=‘active‘><a href=‘/%s?p=%s‘>%s</a></li>" %(self.page_url,i,i)
 87             else:
 88                 temp = "<li><a href=‘/%s?p=%s‘>%s</a></li>" % (self.page_url,i, i)
 89             page_list.append(temp)
 90
 91         if self.current_page == self.num_pages:
 92             nex = "<li><a href=‘#‘>下一页</a></li>"
 93         else:
 94             nex = "<li><a href=‘/%s?p=%s‘>下一页</a></li>" % (self.page_url,self.current_page + 1)
 95         page_list.append(nex)
 96
 97         last = "<li><a href=‘/%s?p=%s‘>尾页</a></li>" %(self.page_url,self.num_pages)
 98         page_list.append(last)
 99
100         return ‘‘.join(page_list)

分页模块后端代码

 1 from app01.paging import Pagination
 2
 3 USER_LIST = []
 4 for i in range(1, 999):
 5     temp = {‘name‘: ‘root‘ + str(i), ‘age‘: i}
 6     USER_LIST.append(temp)
 7
 8 def index2(request):
 9     current_page = request.GET.get(‘p‘)
10     page_obj = Pagination(current_page,999,page_url="index2.html")
11     data_list = USER_LIST[page_obj.start_page_item():page_obj.end_page_item()]
12     return render(request,"index2.html",{"data":data_list,"page_obj":page_obj})

分页模块视图部分

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="/static/plugins/bootstrap/css/bootstrap.css"/>
</head>
<body>
    <ul>
        {% for item in data %}
            <li>{{ item.name }}- {{ item.age }}</li>
        {% endfor %}
    </ul>
    <ul class="pagination pagination-sm">
        {{ page_obj.page_str|safe }}
    </ul>
</body>
</html>

前端展示

时间: 2024-10-06 21:58:17

django高级应用(分页功能)的相关文章

django中orm分页功能(内置分页)

分批获取数据的方法 数据库方法 models.Uinfo.objects.all()[10:20] django自带的方法 创建一个新的url urlpatterns = [ url(r'^index.html/', views.index), ] 创建index函数 def index(request): """ 分页功能 :param request: :return: """ user_list = models.Uinfo.objects

Django自定制分页功能

URL: """django_paginner URL Configuration The `urlpatterns` list routes URLs to views. For more information please see: https://docs.djangoproject.com/en/2.1/topics/http/urls/ Examples: Function views 1. Add an import: from my_app import vi

Django自带分页功能

直接上代码: models.py django.db models Asset(models.Model):     OS_CHOICE = [         (, ),         (, ),         (, ),         (, ),         (, ),     ]     hostname = models.CharField(=, =, =)     ip = models.GenericIPAddressField(=, =)     port = model

django网页的分页功能,大家如果有疑问请留言

url文件 from django.contrib import admin from django.conf.urls import url from app01 import views urlpatterns = [ url(r'^user_list', views.user_list) ] 对views文件 def user_list(request): pagesizenumber = request.COOKIES.get('pagesizenumber', 10) #获取COOKI

django 自带分页

使用django 自带分页功能: from django.core.paginator import Paginator,EmptyPage,PageNotAnInteget EmptyPage 是在超出页数时改怎么做 PageNotAnInteget 使用在异常中出现错误的时候该怎么做 objs = [1,2,3,4,5,6,7,8,9] p = Paginator(objs,3) 每页显示3个 p.count 打印的是 objs里有多少个内容 p.num_pages 显示有多少页 p.pag

django之快速分页

本文介绍djanog两种分页,第一是普通分页,第二是使用haystack全文检索的分页. 1.django自带分页功能,这个功能非常好用.基本知识点:Django提供了数据分页的类,这些类被定义在django/core/paginator.py中对象Paginator用于对列进行一页n条数据的分页运算对象Page用于表示第m页的数据Paginator对象 方法init(列表,int):返回分页对象,参数为列表数据,每面数据的条数属性count:返回对象总数属性num_pages:返回页面总数属性

django实现分页功能

在个人博客或者网站上,我们发表文章经常会对博客进行分页,下面代码用django实现: django有它自带的分页功能:Paginator 不过我们用在它基础上开发的另一个包:django-pure-pagination 先了解一下这个包特性: 1.使用与django.core相同的API,因此与现有代码完全兼容. 2.它考虑了现有的GET参数,具有动态查询字符串创建. 3.用html呈现分页功能,开箱即用(方便) 4.使呈现更高级的分页模板更加容易. 使用: 一.安装 在虚拟环境中通过pip安装

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

{oldboy-django][2深入django]分页功能

1 django自带分页 1.1 分页模板 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <link rel="stylesheet" href="/static/plugins/bootstrap-3.3.7-dist/css/boots