Django自定义分页与bootstrap分页结合

django中有自带的分页模块Paginator,想Paginator提供对象的列表,就可以提供每一页上对象的方法。

这里的话不讲解Paginator,而是自定义一个分页类来完成需求:

class Pagination(object):
  """用于Model字段值的选择""" 

  def __init__(self):
    pass 

  @classmethod
  def create_pagination(self, from_name='', model_name='',
             cur_page=1, start_page_omit_symbol = '...',
             end_page_omit_symbol = '...', one_page_data_size=10,
             show_page_item_len=9):
    """通过给的model和分页参数对相关model进行分页
    Args:
      from_name: 导入模块的 from后面的参数
        from {from_name} import model_name
      mode_name: 需要导入的模块名
        from from_name import {model_name}
      cur_page: 当前显示的是第几页
      start_page_omit_symbol: 超出的页数使用怎么样的省略号(前)
        ... 2 3 4
      end_page_omit_symbol: 超出的页数使用怎么样的省略号(后)
        1 2 3 4 ...
      one_page_data_size: 每一页显示几行
      show_page_item_len: 显示几个能点击的页数
    Return:
      pagination: dict
          pagination = {
            'objs': objs, # 需要显示model数据
            'all_obj_counts': all_obj_counts, # 一共多少行数据
            'start_pos': start_pos, # 数据分页开始的数据
            'end_pos': end_pos, # 数据分页结束的数据
            'all_page': all_page, # 一共有多少页
            'cur_page': cur_page, # 当前的页码
            'pre_page': pre_page, # 上一页的页码
            'next_page': next_page, # 下一页的页码
            'page_items': page_items, 能点击的页数
            'start_page_omit_symbol': start_page_omit_symbol, # 开始的省略号
            'end_page_omit_symbol': end_page_omit_symbol, # 结束的省略号
          }
    Raise: None
    """
    # 如果没有输入导入模块需要的相关信息直接退出
    if not from_name or not model_name:
      return None 

    import_str = 'from {from_name} import {model_name}'.format(
                     from_name = from_name,
                     model_name = model_name)
    # 导入模块
    exec import_str 

    start_pos = (cur_page - 1) * one_page_data_size
    end_pos = start_pos + one_page_data_size  

    # 查找需要的model数据
    find_objs_str = ('{model_name}.objects.all()'
             '[{start_pos}:{end_pos}]'.format(
                        model_name = model_name,
                        start_pos = start_pos,
                        end_pos = end_pos))
    objs = eval(find_objs_str)  

    # 计算总共的页数
    find_objs_count_str = '{model_name}.objects.count()'.format(
                        model_name = model_name)
    all_obj_counts = eval(find_objs_count_str)
    all_page = all_obj_counts / one_page_data_size
    remain_obj = all_obj_counts % one_page_data_size
    if remain_obj > 0:
      all_page += 1 

    # 限制当前页不能小于1和并且大于总页数
    cur_page = 1 if cur_page < 1 else cur_page
    cur_page = all_page if cur_page > all_page else cur_page 

    # 获得显示页数的最小页
    start_page = cur_page - show_page_item_len / 2
    if start_page > all_page - show_page_item_len:
      start_page = all_page - show_page_item_len + 1
    start_page = 1 if start_page < 1 else start_page 

    # 获得显示页数的最大页
    end_page = cur_page + show_page_item_len / 2
    end_page = all_page if end_page > all_page else end_page
    if end_page < show_page_item_len and all_page > show_page_item_len:
      end_page = show_page_item_len 

    # 获得上一页
    pre_page = cur_page - 1
    pre_page = 1 if pre_page < 1 else pre_page 

    # 获得下一页
    next_page = cur_page + 1
    next_page = all_page if next_page > all_page else next_page 

    # 处理省略符,是否显示
    if start_page <= 1:
      start_page_omit_symbol = '' 

    if end_page >= all_page:
      end_page_omit_symbol = '' 

    # 创建能点击的展示页码
    page_items = range(start_page, end_page + 1) 

    pagination = {
      'objs': objs,
      'all_obj_counts': all_obj_counts,
      'start_pos': start_pos,
      'end_pos': end_pos,
      'all_page': all_page,
      'cur_page': cur_page,
      'pre_page': pre_page,
      'next_page': next_page,
      'page_items': page_items,
      'start_page_omit_symbol': start_page_omit_symbol,
      'end_page_omit_symbol': end_page_omit_symbol,
    } 

    return pagination

利用bootstrap的css,生成好看的html如下:

<nav aria-label="Page navigation">
 <ul class="pagination">
  {% if pagination.cur_page != 1 %}
  <li><a href="?cur_page=1" rel="external nofollow" ><<</a></li>
  <li>
   <a href="?cur_page={{ pagination.pre_page }}" rel="external nofollow" aria-label="Previous">
    <span aria-hidden="true">«</span>
   </a>
  </li>
  {% endif %}
  {% for page_item in pagination.page_items %}
  {% if page_item == pagination.cur_page %}
    <li><a href="?cur_page={{ page_item }}" rel="external nofollow" rel="external nofollow" >{{ page_item }}</a></li>
  {% else %}
    <li><a href="?cur_page={{ page_item }}" rel="external nofollow" rel="external nofollow" >{{ page_item }}</a></li>
  {% endif %}
  {% endfor%}
  {% if pagination.cur_page != pagination.all_page %}
  <li>
   <a href="?cur_page={{ pagination.next_page }}" rel="external nofollow" aria-label="Next">
    <span aria-hidden="true">»</span>
   </a>
  </li>
  <li><a href="?cur_page={{ pagination.all_page }}" rel="external nofollow" >>></a></li>
  {% endif %}
 </ul>
</nav>

view函数如下:

def blogpage(request):
    #ojt = BlogPost.object.all()
    #p = Paginator(ojt,2)
    #page_count = p.count
    #page_data = p.page(page)
    #template = 'blogpage.html'
    #info = {'page_data':page_data,'page_count':page_count}
    #return render(request,template,{'page_data':page_data,'page_count':page_count})
    try:
        cur_page = int(request.GET.get('cur_page', '1'))
    except ValueError:
        cur_page = 1 

    pagination = Pagination.create_pagination(
             from_name='blog.models',
             model_name='BlogPost',
             cur_page=cur_page,
             start_page_omit_symbol = '...',
             end_page_omit_symbol = '...',
             one_page_data_size=1,
             show_page_item_len=5)
    return render(request, 'blogpage.html',{'pagination':pagination})

效果图如下:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Django自定义分页效果

    分页功能在每个网站都是必要的,对于分页来说,其实就是根据用户的输入计算出应该显示在页面上的数据在数据库表中的起始位置. 确定分页需求: 1. 每页显示的数据条数 2. 每页显示页号链接数 3. 上一页和下一页 4. 首页和末页 效果图: 首先,利用django内置的分页功能,写分页类: from django.core.paginator import Paginator, Page # 导入django分页模块 class PageInfo(object): def __init__(self

  • django实现分页的方法

    本文实例讲述了django实现分页的方法.分享给大家供大家参考.具体如下: Python代码如下: #!/usr/bin/env python # -*- coding: utf-8 -*- # Create your views here. from django.shortcuts import render_to_response from winlog.log_dj.models import Winlog from django.core.paginator import Pagina

  • 在django中使用自定义标签实现分页功能

    效果演示: github地址:https://github.com/mncu/django_projects/tree/master/django_projects/pagination_test 本例中总页数为30页,显示页数为12页,当前页的前排页数为4,后排页数为5 将分页分为三种情况: 1   当前页为第1页到第7页的时候,无省略页,且12个位置的内容是不变 2  当前页为第8页到第25页时,位置1与位置2内容不变,当前页一直处于位置7, 3  当前页为第25页到第30页时,位置1与位置

  • Django实现快速分页的方法实例

    前言 本文主要给大家介绍了关于Django快速分页的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 分页 在web开发中,对大量的商品进行分页显示,是常见的需求,django对分页直接提供了现成的函数,让我们的开发更为快速便捷... 动图_Django快速分页 示例代码: 在后端(视图函数中) from django.shortcuts import render from .models import ShowMyComputer # 引入方法 from djang

  • Django自定义分页与bootstrap分页结合

    django中有自带的分页模块Paginator,想Paginator提供对象的列表,就可以提供每一页上对象的方法. 这里的话不讲解Paginator,而是自定义一个分页类来完成需求: class Pagination(object): """用于Model字段值的选择""" def __init__(self): pass @classmethod def create_pagination(self, from_name='', model_

  • jquery pagination插件动态分页实例(Bootstrap分页)

    第一种Bootstrap -默认的分页实例,供大家参考,具体内容如下 <!DOCTYPE html> <html> <head> <title>Bootstrap 实例 - 默认的分页</title> <link href="http://libs.baidu.com/bootstrap/3.0.3/css/bootstrap.min.css" rel="stylesheet"> <scr

  • Django框架实现的简单分页功能示例

    本文实例讲述了Django框架实现的简单分页功能.分享给大家供大家参考,具体如下: 前面一篇<Django开发的简易留言板>写了个简单的留言板,如果数据量太多的话在一页显示就不那么友好了,本文就是做一个分页显示. 代码在上一篇的基础上修改. 导入分页模块并修改views #只需修改index函数即可 from django.core.paginator import Paginator def index(request): messages = models.Message.objects.

  • NodeJS和BootStrap分页效果的实现代码

    1.数据处理 首先在动态js中,根据url参数获取数据库文档的数量,设置分页的大小,获取当前页面的数据,然后将文档数量pagecount,分页大小pagesize,以及当前页面currentpage传递到页面中. 2.处理分页效果 我采用的是JavaScript动态生成的,你也可以利用ejs支持函数的特性将其封装后生成html形式的分页. 首先,添加分页ul,在你的页面中需要显示的位置添加代码: <ul class="pagination" id="pagination

  • 基于Bootstrap分页的实例讲解(必看篇)

    前面的话 分页导航几乎在每个网站都可见,好的分页能给用户带来好的用户体验.本文将详细介绍Bootstrap分页 概述 在Bootstrap框架中提供了两种分页导航: ☑ 带页码的分页导航 ☑ 带翻页的分页导航 页码分页 带页码的分页导航,可能是最常见的一种分页导航,特别是在列表页内容超多的时候,会给用户提供分页的导航方式 [默认分页] 平时很多人喜欢用div>a和div>span结构来制作带页码的分页导航.不过,在Bootstrap框架中使用的是ul>li>a这样的结构,在ul标签

  • ASP.NET GridView的Bootstrap分页样式

    本文实例为大家分享了GridView的Bootstrap分页样式,供大家参考,具体内容如下 Revenue.cs收入类,包括实体模型和业务逻辑 public class Revenue { public Revenue(string country, string revenue, string salesmanager, string year) { this.country = country; this.revenue = revenue; this.salesmanager = sale

  • thinkphp框架page类与bootstrap分页(美化)

    bootstrap分样式使用方法这里写链接内容 <nav aria-label="Page navigation"> <ul class="pagination"> <li> <a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" re

  • Bootstrap分页插件之Bootstrap Paginator实例详解

    Bootstrap Paginator是一款基于Bootstrap的js分页插件,功能很丰富,个人觉得这款插件已经无可挑剔了.它提供了一系列的参数用来支持用户的定制,提供了公共的方法可随时获得插件状态的改变,以及事件来监听用户的动作.目前经过测试的浏览器包括: Firefox 5+, Chrome 14+, Safari 5+, Opera 11.6+ and IE 7+. 官网地址:http://bootstrappaginator.org/ DownloadVisit Project in

  • yii使用bootstrap分页样式的实例

    Bootstrap是Twitter推出的一个开源的用于前端开发的工具包.它由Twitter的设计师Mark Otto和Jacob Thornton合作开发,是一个CSS/HTML框架.Bootstrap提供了优雅的HTML和CSS规范,它即是由动态CSS语言Less写成.Bootstrap一经推出后颇受欢迎,一直是GitHub上的热门开源项目,包括NASA的MSNBC(微软全国广播公司)的Breaking News都使用了该项目. 本文为大家介绍的是yii使用bootstrap分页样式方法,感兴

  • Django Rest framework三种分页方式详解

    前言 我们数据库有几千万条数据,这些数据需要展示,我们不可能直接从数据库把数据全部读取出来. 因为这样会给内存造成巨大的压力,很容易就会内存溢出,所以我们希望一点一点的取. 同样,展示的时候也是一样的,我们必定会对数据进行分页显示. 本文将详细讲述DRF为我们提供的三种分页方式. 全局配置 REST_FRAMEWORK = { # 对所有分页器生效,但优先级低 'PAGE_SIZE': 5, # 每页显示5条数据 } 我们先准备好用于测试分页的数据以及序列化类 数据表 from django.d

随机推荐