博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
第十二章 Django框架——分页组件
阅读量:5374 次
发布时间:2019-06-15

本文共 7081 字,大约阅读时间需要 23 分钟。

第十二章 Django框架——分页组件

 

一、Django的分页器Paginator

二、视图函数层Views

三、模板层Templates

四、补充

五、自己写逻辑实现分页

 

一、Django的分页器Paginator

如何使用分页器Paginator(how):

导入模块

from django.core.paginator import Paginator

参数

Paginator对象:    paginator = Paginator(user_list, 10)# per_page: 每页显示条目数量# count:    数据总个数# num_pages:总页数# page_range:总页数的索引范围,如: (1,10),(1,200)# page:     page对象    page对象:page=paginator.page(1)# has_next              是否有下一页# next_page_number      下一页页码# has_previous          是否有上一页# previous_page_number  上一页页码# object_list           分页之后的数据列表# number                当前页# paginator             paginator对象

 

二、视图函数层Views

from django.shortcuts import renderfrom django.core.paginator import Paginator, EmptyPage, PageNotAnIntegerL = []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部分
View Code

 

三、模板层Templates

    
    {
    % for item in posts %}
  • {
    { item }}
  • {
    % endfor %}
内置分页HTML部分
View Code

 

四、补充

'''    显示左5,右5,总共11个页,如果总页码大于11        1.1 if 当前页码减5小于1,要生成1到12的列表(顾头不顾尾,共11个页码)            page_range=range(1,12)        1.2 elif 当前页码+5大于总页码,生成当前页码减10,到当前页码加1的列表(顾头不顾尾,共11个页码)            page_range=range(paginator.num_pages-10,paginator.num_pages+1)        1.3 else 生成当前页码-5,到当前页码+6的列表            page_range=range(current_page_num-5,current_page_num+6)其它情况,生成的列表就是pageinator的page_range        page_range=paginator.page_range    '''
左五右五显示页码的逻辑

 

五、自己写逻辑实现分页(转自https://www.cnblogs.com/liwenzhou/p/8343243.html)

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 = '
  • 首页
  • ' page_html_list.append(first_li) # 加上一页 if current_page == 1: prev_li = '
  • 上一页
  • ' else: prev_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 = '
  • {0}
  • '.format(i) else: li_tag = '
  • {0}
  • '.format(i) page_html_list.append(li_tag) # 加下一页 if current_page == total_page: next_li = '
  • 下一页
  • ' else: next_li = '
  • 下一页
  • '.format(current_page+1) page_html_list.append(next_li) # 加尾页 page_end_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, current_page, total_count, base_url, per_page=10, max_show=11):        """        :param current_page: 当前页        :param total_count: 数据库中数据总数        :param per_page: 每页显示多少条数据        :param max_show: 最多显示多少页        """        try:            current_page = int(current_page)        except Exception as e:            current_page = 1        self.current_page = current_page        self.total_count = total_count        self.base_url = base_url        self.per_page = per_page        self.max_show = max_show        # 总页码        total_page, more = divmod(total_count, per_page)        if more:            total_page += 1                half_show = int((max_show - 1) / 2)        self.half_show = half_show        self.total_page = total_page    @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):        if self.current_page <= self.half_show:            show_start = 1            show_end = self.max_show        else:            if self.current_page + self.half_show >= self.total_page:                show_start = self.total_page - self.max_show                show_end = self.total_page            else:                show_start = self.current_page - self.half_show                show_end = self.current_page + self.half_show                # 生成页面上显示的页码        page_html_list = []        # 加首页        first_li = '
  • 首页
  • '.format(self.base_url) page_html_list.append(first_li) # 加上一页 if self.current_page == 1: prev_li = '
  • 上一页
  • ' else: prev_li = '
  • 上一页
  • '.format(self.base_url, self.current_page - 1) page_html_list.append(prev_li) for i in range(show_start, show_end + 1): if i == self.current_page: li_tag = '
  • {1}
  • '.format(self.base_url, i) else: li_tag = '
  • {1}
  • '.format(self.base_url, i) page_html_list.append(li_tag) # 加下一页 if self.current_page == self.total_page: next_li = '
  • 下一页
  • ' else: next_li = '
  • 下一页
  • '.format(self.base_url, self.current_page + 1) page_html_list.append(next_li) # 加尾页 page_end_li = '
  • 尾页
  • '.format(self.base_url, self.total_page) page_html_list.append(page_end_li) return "".join(page_html_list)封装保存版
    封装版
    def user_list(request):    pager = Pagination(request.GET.get("page"), len(data), request.path_info)    user_list = data[pager.start:pager.end]    page_html = pager.page_html()    return render(request, "user_list.html", {
    "user_list": user_list, "page_html": page_html})
    封装版使用方法

     

     

    转载于:https://www.cnblogs.com/neymargoal/p/9664192.html

    你可能感兴趣的文章
    2.1 容器的基本实现
    查看>>
    用映射的方法获取当前方法的名称
    查看>>
    一个值得纪念的日子
    查看>>
    Android 访问 Webapi 更新UI
    查看>>
    极角排序详解:
    查看>>
    数据结构之图形结构
    查看>>
    设计方法小总结
    查看>>
    Verify Preorder Serialization of a Binary Tree
    查看>>
    addEvent
    查看>>
    第三批游戏版号下发 移动安全从业者有话说
    查看>>
    solr 5.3 导入sqlserver数据
    查看>>
    springMVC第二天——高级参数绑定与其它特性
    查看>>
    转载:Centos升级gcc
    查看>>
    腾讯云的基本配置(centos 7.1)及mysql的使用
    查看>>
    day 46 前端基础之 BOM和 DOM
    查看>>
    无限分类(3种不同方案)
    查看>>
    Emacs Org-mode中英文字体设置
    查看>>
    Go 文件操作
    查看>>
    webpack 使用配置文件
    查看>>
    iOS热更新技术被苹果官方警告?涉及到RN、Weex、JSPatch
    查看>>