Django内置的分页模块

自定义分页

未封装版:

  • 优点:直观
  • 缺点:代码乱,不易维护,可拓展性差
data = []

for i in range(1, 302):
    tmp = {"id": i, "name": "alex-{}".format(i)}
    data.append(tmp)

print(data)

def user_list(request):

    # user_list = data[0:10]
    # user_list = data[10:20]
    try:
        current_page = int(request.GET.get("page"))
    except Exception as e:
        current_page = 1

    per_page = 10

    # 数据总条数
    total_count = len(data)
    # 总页码
    total_page, more = divmod(total_count, per_page)
    if more:
        total_page += 1

    # 页面最多显示多少个页码
    max_show = 11
    half_show = int((max_show-1)/2)

    if current_page <= half_show:
        show_start = 1
        show_end = max_show
    else:
        if current_page + half_show >= total_page:
            show_start = total_page - max_show
            show_end = total_page
        else:
            show_start = current_page - half_show
            show_end = current_page + half_show

    # 数据库中获取数据
    data_start = (current_page - 1) * per_page
    data_end = current_page * per_page

    user_list = data[data_start:data_end]

    # 生成页面上显示的页码
    page_html_list = []
    # 加首页
    first_li = ‘<li><a href="/user_list/?page=1">首页</a></li>‘
    page_html_list.append(first_li)
    # 加上一页
    if current_page == 1:
        prev_li = ‘<li><a href="#">上一页</a></li>‘
    else:
        prev_li = ‘<li><a href="/user_list/?page={}">上一页</a></li>‘.format(current_page - 1)
    page_html_list.append(prev_li)
    for i in range(show_start, show_end+1):
        if i == current_page:
            li_tag = ‘<li class="active"><a href="/user_list/?page={0}">{0}</a></li>‘.format(i)
        else:
            li_tag = ‘<li><a href="/user_list/?page={0}">{0}</a></li>‘.format(i)
        page_html_list.append(li_tag)

    # 加下一页
    if current_page == total_page:
        next_li = ‘<li><a href="#">下一页</a></li>‘
    else:
        next_li = ‘<li><a href="/user_list/?page={}">下一页</a></li>‘.format(current_page+1)
    page_html_list.append(next_li)

    # 加尾页
    page_end_li = ‘<li><a href="/user_list/?page={}">尾页</a></li>‘.format(total_page)
    page_html_list.append(page_end_li)

    page_html = "".join(page_html_list)

    return render(request, "user_list.html", {"user_list": user_list, "page_html": page_html})

  

封装版:

  • 优点:易维护、可拓展性强
  • 缺点:逻辑相对复杂
"""
自定义分页组件
"""
class Pagination(object):

    def __init__(self, data_num, current_page, url_prefix, per_page=10,  max_show=11):
        """
        进行初始化.
        :param data_num: 数据总数
        :param current_page: 当前页
        :param url_prefix: 生成的页码的链接前缀
        :param per_page: 每页显示多少条数据
        :param max_show: 页面最多显示多少个页码
        """
        self.data_num = data_num
        self.per_page = per_page
        self.max_show = max_show
        self.url_prefix = url_prefix

        # 把页码数算出来
        self.page_num, more = divmod(data_num, per_page)
        if more:
            self.page_num += 1

        try:
            self.current_page = int(current_page)
        except Exception as e:
            self.current_page = 1
            # 如果URL传过来的页码数是负数
        if self.current_page <= 0:
            self.current_page = 1
            # 如果URL传过来的页码数超过了最大页码数
        elif self.current_page > self.page_num:
            self.current_page = self.page_num  # 默认展示最后一页

        # 页码数的一半 算出来
        self.half_show = max_show // 2

        # 页码最左边显示多少
        if self.current_page - self.half_show <= 1:
            self.page_start = 1
            self.page_end = self.max_show
        elif self.current_page + self.half_show >= self.page_num:  # 如果右边越界
            self.page_end = self.page_num
            self.page_start = self.page_num - self.max_show
        else:
            self.page_start = self.current_page - self.half_show
            # 页码最右边显示
            self.page_end = self.current_page + self.half_show

        if self.page_num < self.page_end:
            self.page_end = self.page_num  # 如果总页面小于结束页面,那么结束页面即为总页码

    @property
    def start(self):
        # 数据从哪儿开始切
        return (self.current_page - 1) * self.per_page

    @property
    def end(self):
        # 数据切片切到哪儿
        return self.current_page * self.per_page

    def page_html(self):
        # 生成页码
        l = []
        # 加一个首页
        l.append(‘<li><a href="{}?page=1">首页</a></li>‘.format(self.url_prefix))
        # 加一个上一页
        if self.current_page == 1:
            l.append(‘<li class="disabled" ><a href="#">?</a></li>‘.format(self.current_page))
        else:
            l.append(‘<li><a href="{}?page={}">?</a></li>‘.format(self.url_prefix, self.current_page - 1))

        for i in range(self.page_start, self.page_end + 1):

            if i == self.current_page:
                tmp = ‘<li class="active"><a href="{0}?page={1}">{1}</a></li>‘.format(self.url_prefix, i)
            else:
                tmp = ‘<li><a href="{0}?page={1}">{1}</a></li>‘.format(self.url_prefix, i)
            l.append(tmp)

        # 加一个下一页
        if self.current_page == self.page_num:
            l.append(‘<li class="disabled"><a href="#">?</a></li>‘.format(self.current_page))
        else:
            l.append(‘<li><a href="{}?page={}">?</a></li>‘.format(self.url_prefix, self.current_page + 1))
        # 加一个尾页
        l.append(‘<li><a href="{}?page={}">尾页</a></li>‘.format(self.url_prefix, self.page_num))
        return "".join(l)

封装版使用步骤:

  1. 将上面的一段代码复制到自定义的模块(pt文件)中
  2. 导入自定义模块
  3. 在views系统的函数里写入以下代码

    def user_list(request):
        # 实例化一个分页类的对象
        obj = Pagination(blogs.count(),page,‘blogs.html‘)
        # 根据传入的总博客数、页码获取当页需要展示的博客
        blog_list = blogs[obj.start:obj.end]
        # 根据传入的博客数及页码获取生成分页的html格式的页码列表
        page_html = pager.page_html()
        #返回指定页面
        return render(request, "blog_list.html", {"blog_list": blog_list, "page_html": page_html})
    

      

  4. 在需要生成页面的html页面写入以下代码

    <div class="topicListFooter fenye">
         <ul class="pagination">
             {{ page_html|safe }}
          </ul>
     </div>
    

      注:示例中用的是bootstrap分页样式

Django中的内置分页(不能展示页码列表)

from django.shortcuts import render
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger

L = []
for i in range(999):
    L.append(i)

def index(request):
    current_page = request.GET.get(‘p‘)

    paginator = Paginator(L, 10)
    # per_page: 每页显示条目数量
    # count:    数据总个数
    # num_pages:总页数
    # page_range:总页数的索引范围,如: (1,10),(1,200)
    # page:     page对象
    try:
        posts = paginator.page(current_page)
        # has_next              是否有下一页
        # next_page_number      下一页页码
        # has_previous          是否有上一页
        # previous_page_number  上一页页码
        # object_list           分页之后的数据列表
        # number                当前页
        # paginator             paginator对象
    except PageNotAnInteger:
        posts = paginator.page(1)
    except EmptyPage:
        posts = paginator.page(paginator.num_pages)
    return render(request, ‘index.html‘, {‘posts‘: posts})

内置分页view部分

  

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
<ul>
    {% for item in posts %}
        <li>{{ item }}</li>
    {% endfor %}
</ul>

<div class="pagination">
      <span class="step-links">
        {% if posts.has_previous %}
            <a href="?p={{ posts.previous_page_number }}">Previous</a>
        {% endif %}
          <span class="current">
            Page {{ posts.number }} of {{ posts.paginator.num_pages }}.
          </span>
          {% if posts.has_next %}
              <a href="?p={{ posts.next_page_number }}">Next</a>
          {% endif %}
      </span>

</div>
</body>
</html>

内置分页HTML部分

原文地址:https://www.cnblogs.com/jiangchunsheng/p/8780251.html

时间: 2024-11-02 19:05:49

Django内置的分页模块的相关文章

扩展Django内置的auth模块代码示例

一,创建自定义User模型类.继承AbstractUser 方法1 新建一个表,表里面有手机号,邮箱,地址,一对一与User表进行关联 方法2 新定义一个类,继承类AbstractUser ( auth模块的User类也是继承此AbstractUser 类的) 说明:python 语法上,也是可以直接继承User类的 以下代码,我们扩展了两个字段,phone和addr 注意:settings.py中一定要指不使用内置的User表,而是使用新的UserInfo表 AUTH_USER_MODEL='

Django框架进阶6 多对多三种创建方式, Ajax, Content-Type前后端传输数据编码格式, Ajax发送文件数据, django内置的序列化功能, Ajax结合sweetalert实现删除二次确认, 批量插入数据, 自定义分页器, ajax结合sweetalert实现删除二次确认

多对多三种创建方式 1.全自动(较为常用) class Book(models.Model): title = models.CharField(max_length=32) authors = models.ManyToManyField(to='Author') # orm就会自动帮你创建第三张表 class Author(models.Model): name = models.CharField(max_length=32) ''' 好处:第三张表自己创建 不足之处:第三张表无法扩展额外

Django内置Admin

Django内置的Admin是对于model中对应的数据表进行增删改查提供的组件,使用方式有: 依赖APP: django.contrib.auth django.contrib.contenttypes django.contrib.messages django.contrib.sessions 模板的context_processors: django.contrib.auth.context_processors.auth django.contrib.messages.context_

Python内置的urllib模块不支持https协议的解决办法

Django站点使用django_cas接入SSO(单点登录系统),配置完成后登录,抛出“urlopen error unknown url type: https”异常.寻根朔源发现是python内置的urllib模块不支持https协议. >>> import urllib>>> urllib.urlopen('http://www.baidu.com')<addinfourl at 269231456 whose fp = <socket._fileo

django 内置 admin

Django内置的Admin是对于model中对应的数据表进行增删改查提供的组件使用方式有 依赖APP         django.contrib.auth         django.contrib.contenttypes         django.contrib.messages         django.contrib.sessions     模板的context_processors         django.contrib.auth.context_processo

Django内置过滤器详解附代码附效果图--附全部内置过滤器帮助文档

前言 基本环境 Django版本:1.11.8 Python版本:3.6 OS: win10 x64 本文摘要 提供了常用的Django内置过滤器的详细介绍,包括过滤器的功能.语法.代码和效果示例. 本文完整项目文件代码下载地址:完整示例 Django完整内置过滤器帮助文档:Django内置过滤器完整版 参考文献:Django 中文文档 1.8 内置过滤器 注意:所有带参数的过滤器,在使用时,冒号:和参数中间不能有空格. add加 功能: 把add后的参数num加给value: 数字相加会进行算

Django内置模板标签

Django内置标签总览 可以查询下表来总览Django的内置标签: 标签 说明 autoescape 自动转义开关 block 块引用 comment 注释 csrf_token CSRF令牌 cycle 循环对象的值 debug 调试模式 extends 继承模版 filter 过滤功能 firstof 输出第一个不为False的参数 for 循环对象 for … empty 带empty说明的循环 if 条件判断 ifequal 如果等于 ifnotequal 如果不等于 ifchange

Python内置的操作系统模块(os)与解释器交互模块(sys)

Python内置的操作系统模块(os)与解释器交互模块(sys) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本片博客只介绍Python调用操作系统的模块即os模块,以及Python和解释器打交道的模块即sys模块. 一.操作系统模块常用方法(os) 1 #!/usr/bin/env python 2 #_*_coding:utf-8_*_ 3 #@author :yinzhengjie 4 #blog:http://www.cnblogs.com/yinzhengjie/

Django内置重置密码的功能(发邮箱)

首先我们要想用Django内置的重置密码的功能,我们要知道Django内置的函数是怎么写的 def password_reset(request, template_name='registration/password_reset_form.html', email_template_name='registration/password_reset_email.html', subject_template_name='registration/password_reset_subject.