设置后的效果如下:

  • Django 给我们提供了分页的功能:`Paginator`和`Page`类都是用来做分页的。他们在Django中的路径为:`from django.core.paginator import Page, Paginator`
  • 先简单解释一下他们的属性和方法:
  • # Paginator常用属性和方法
    1. `count`: 总共有多少条数据。
    2. `num_pages`: 总共有多少页。
    3. `page_range`:页面的区间。比如有三页,那么就是`range(1,4)`。 # Page常用属性和方法:
    1. `has_next`: 是否还有下一页。
    2. `has_previous`: 是否还有上一页。
    3. `next_page_number`: 下一页的页码。
    4. `previous_page_number`: 上一页的页码。
    5. `number`: 当前页。
    6. `start_index`: 当前页的第一条数据的索引值。
    7. `end_index`: 当前页的最后一条数据的索引值。

      

  • article_list.html,这里我使用了bootscrip的组件样式:
  • <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>Title</title> <!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
    </head>
    <body>
    <ul>
    {% for article in articles %}
    <li>{{ article.title }}</li>
    {% endfor %}
    </ul> <nav aria-label="Page navigation">
    <ul class="pagination">
    {% if page_obj.has_previous %}
    <li><a href="{% url 'front:article_list' %}?page={{ page_obj.previous_page_number }}">上一页</a></li>
    {% else %}
    <li class="disabled"><a href="javascript:void(0);">上一页</a></li>
    {% endif %} {% if left_has_more %}
    <li><a href="{% url 'front:article_list' %}?page=1">1</a></li>
    <li><a href="javascript:void(0);">...</a></li>
    {% endif %} {# 左边的页码 #}
    {% for left_page in left_pages %}
    <li><a href="{% url 'front:article_list' %}?page={{ left_page }}">{{ left_page }}</a></li>
    {% endfor %} {# 中间的页码 #}
    <li><a href="{% url 'front:article_list' %}?page={{ current_page }}">{{ current_page }}</a></li>
    {# 右边的页码 #}
    {% for right_page in right_pages %}
    <li><a href="{% url 'front:article_list' %}?page={{ right_page }}">{{ right_page }}</a></li>
    {% endfor %} {% if right_has_more %}
    <li><a href="javascript:void(0);">...</a></li>
    <li><a href="{% url 'front:article_list' %}?page={{ paginator.num_pages }}">{{ paginator.num_pages }}</a></li>
    {% endif %} {% if page_obj.has_next %}
    <li><a href="{% url 'front:article_list' %}?page={{ page_obj.next_page_number }}">下一页</a></li>
    {% else %}
    <li class="disabled"><a href="javascript:void(0);">下一页</a></li>
    {% endif %}
    </ul>
    </nav>
    </body>
    </html>

      原理基本上是将页码分成三部分,第一部分是上一页和第一页,第二部分是当前所在页前两页和后两页(共计五页),第三部分是下一页和最后一页。

  • 视图函数:views.py
  • class ArticleListView(ListView):
    model = Article
    template_name = 'article_list.html'
    context_object_name = 'articles'
    paginate_by = 10
    ordering = 'create_time' def get_context_data(self, **kwargs):
    context = super(ArticleListView, self).get_context_data(**kwargs) paginator_data = self.get_pagination_data(paginator, page_obj)
    context.update(paginator_data) # 将当前字典的kv更新到context字典中。
    return context
      
    # 这里来负责跳转的页码处理
    def get_pagination_data(self, paginator, page_obj, around_count=2): # arount_count=2表示从当前页前推两页,后推两页
    current_page = page_obj.number
    num_page = paginator.num_pages left_has_more = False # 左边还有没有未显示的页码
    right_has_more = False
         # 判断当前页是不是比4小,比如当前页是第二页,他就不能存在 0.1.2.3.4这种情况。
    if current_page <= around_count + 2:
    left_page = range(1, current_page)
    else:
    left_has_more = True
    left_page = range(current_page-around_count, current_page)
    if current_page >= num_page-around_count-1:
    right_page = range(current_page+1, num_page+1)
    else:
    right_has_more = True
    right_page = range(current_page+1, current_page+3)
    return {
    'left_pages': left_page,
    'right_pages': right_page,
    'current_page': current_page,
    'left_has_more': left_has_more,
    'right_has_more': right_has_more,
    }

      这里定义了一个ArticleListView类,此类继承自ListView,用来处理请求等问题。

  • front.urls.py,处理url跳转
  • from django.urls import path
    from . import views app_name = 'front'
    urlpatterns = [
    path('add/', views.add_article, name='add'),
    path('list/', views.ArticleListView.as_view(), name='article_list')
    ]

      这里我把这次的跳转放到了front app中,可以直接放到项目的urls.py中。

  • 基本上就是这样,如果看不懂可以看一下我的整个项目,写的很乱,很多高级视图学习的时候的练习代码都堆在这里:https://github.com/longbigbeard/Python_Web/tree/master/Django%E7%BB%83%E4%B9%A0/views_gaoji
  • 以上。

Django 中设置分页页码,只显示当前页以及左右两页的更多相关文章

  1. VS编译器中设置 输出窗口 只显示error,不显示warning 要如何配置

    VS编译器中设置 输出窗口 只显示error,不显示warning 要如何配置 在编译大型项目的时候,总是VS编译器的输出窗口总是会出现一堆warning警告,要想在里面找到error错误,要使用鼠标 ...

  2. easyUI的分页,只显示第X 共Y页。改为显示 第X 页 共Y页

    如下图,easyUI的分页,只显示第X 共Y页. 需求需要显示 第X 页 共Y页. 解决办法:在easyui-lang-zh_CN.js更改以下代码,即可.也就是在 “共{pages}页”前面加个 “ ...

  3. img只显示图片一部分 或 css设置背景图片只显示图片指定区域

    17:14 2016/3/22img只显示图片一部分 或 css设置背景图片只显示图片指定区域 background-position: 100% 56%; 设置背景图片显示图片的哪个坐标区域,图片左 ...

  4. django中设置定时任务

    django中设置定时任务 在django中设置定时任务我们可以借用django-crontab这个第三包来实现 django-crontab只能在linux系统下使用 安装: pip install ...

  5. django中的分页设置

    1.在控制台中的展示 from django.core.paginator import Paginator iter = 'abcdefghijklmn' inator = Paginator(it ...

  6. Django中的分页,cookies与session

    cookie Cookie的由来 大家都知道HTTP协议是无状态的. 无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不 ...

  7. django中的分页管理

    有时,展示的对象太多,需要对他们进行分页展示,不能一页把所有的结果都展示出来吧,那样的话,哈哈,挺逗 使用Django分页器功能 从Django中导入Paginator模块(没有的话,自行下载,我是w ...

  8. Django中的分页操作、form校验工具

    批量插入数据 后端: def fenye(request): book_list=[] for i in range(100): book_list.append(models.Book(title= ...

  9. 如何让html中的td文字只显示部分

    以下笔记有待测试 ———————————————————— <table style="table-layout:fixed"> <tr> <td s ...

随机推荐

  1. Problem A. Array Factory XVII Open Cup named after E.V. Pankratiev Stage 4: Grand Prix of SPb, Sunday, Octorber 9, 2016

    思路: 直接二分长度不可行,因为有负数. 考虑枚举坐便删l个数,那如果可以在短时间内求出符合条件的右边最小删的数的个数,这题便可做了. 即:当左边删l个数时,要使sum[n]-sum[l]-fsum[ ...

  2. 2017浙江省赛 C - What Kind of Friends Are You? ZOJ - 3960

    地址:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3960 题目: Japari Park is a large zoo ...

  3. docker swarm overlay stack 服务部署记录

    项目xxx(后端),xxx-ui前端(前后端分离的项目) 依赖mysql,elasticsearch.分别制作了四个镜像来做这件事.希望可以制作跨主机的部署,使用了swarm,以下是学习记录. 参考 ...

  4. CCTableView

    今天用到TableView, 我就来记录一下....这些都是在网上找到了资料 //首先 继承 : public cocos2d::extension::CCTableViewDelegate,publ ...

  5. Django---ModelForm详解

    示例: from django.db import models from django.forms import ModelForm TITLE_CHOICES = ( ('MR', 'Mr.'), ...

  6. 从toString()方法到Object.prototype.toString.call()方法

    一.toString方法和Object.prototype.toSting.call()的区别 var arr=[1,2]; 直接对一个数组调用toString()方法, console.log(ar ...

  7. VCF和GVCF格式说明

    注意:本文的内容主要来自于GATK官网的讲解,所以vcf也是GATK产生的,用其他caller,比如varscan2产生的vcf文件的内容注释可能不一致. 参考:https://gatkforums. ...

  8. char、varchar与text

    总结自:https://www.cnblogs.com/mjbrian/p/6866263.html char:       定长,长度范围是0~255. 当长度不足255时,用空格来填充剩下的字符. ...

  9. 20135320赵瀚青LINUX内核分析第四周学习笔记

    赵瀚青原创作品转载请注明出处<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 概述 本周的内容主要是讲解系 ...

  10. 关于C++中的string的小知识点

    这是GCC版本5.x的情况下的分析,在GCC版本4.x的情况下std::string的内存布局将不同.逆向C++的过程中经常遇到std::string,它在内存中的状态是什么样呢?我先简单地写了一个程 ...