Django作为Python Web开发框架的一哥,提供了企业级网站开发所需要的几乎所有功能,其中就包括自带分页功能。利用Django自带的Paginator类,我们可以很轻松地实现分页。Django 2.0和1.X最大的不同在于新增了get_page()方法。我们现在来具体看看有什么不同。

Django 1.X 和Django 2.0下实现分页

利用Django实现分类非常简单,我们只需要修改views.py和模板template。Django 1.X下实现分页代码如下:

# app/views.py - 基于函数的视图

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

from .models import Article

from django.shortcuts import render

def article_list(request):

article_list = Article.objects.all()

paginator = Paginator(article_list, 10)  # 实例化一个分页对象, 每页显示10个

page = request.GET.get('page')  # 从URL通过get页码,如?page=3

try:

articles = paginator.page(page)  # 获取某页对应的记录

except PageNotAnInteger:  # 如果页码不是个整数

articles = paginator.page(1)  # 提取第一页的记录

except EmptyPage:  # 如果页码太大,没有相应的记录

articles = paginator.page(paginator.num_pages)  # 提取最后一页的记录

return render(request, 'article_list.html', {'articles': articles})

你注意到没有?上段代码的try和2个except非常重要,但是看上去有些冗余。Django 2.0下新增了get_page()方法,可以将代码大大简化(如下图所示)。它所实现的功能与上面是一样的。当用户提交的页码不是整数时,提取第一页记录。当用户输入的页码太大时,只提取最后一页记录。

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

from .models import Article

from django.shortcuts import render

def article_list(request):

article_list = Article.objects.all()

paginator = Paginator(article_list, 10)  # 实例化一个分页对象, 每页显示10个

page = request.GET.get('page')  # 从URL通过get页码,如?page=3

articles = paginator.get_page(page)  # 获取某页对应的记录, 如果

return render(request, 'article_list.html', {'articles': articles})

Django 1.X和2.0下的模板是一样的。这里提供两种显示方案。

模板一: 上一页, Page 1 of 3, 下一页

#app/templates/app/article_list.html

{% for article in articles %}

{{ article.title }}

{% endfor %}

<div class="pagination">

<span class="step-links">

{% if articles.has_previous %}

<a href="?page=1">« first</a>

<a href="?page={{ articles.previous_page_number }}">previous</a>

{% endif %}

<span class="current">

Page {{ articles.number }} of {{ articles.paginator.num_pages }}.

</span>

{% if articles.has_next %}

<a href="?page={{ articles.next_page_number }}">next</a>

<a href="?page={{ articles.paginator.num_pages }}">last »</a>

{% endif %}

</span>

</div>

模板二: Page 1, 2, 3, 4, 5, 6, 7, 8, ... (推荐)

#app/templates/app/article_list.html

# Pagination style 2

{% for article in articles %}

{{ article.title }}

{% endfor %}

<div class="pagination">

<nav>

<ul class="pagination">

{% if articles.has_previous %}

<li class="">

<a href="?page={{ articles.previous_page_number }}" aria-label="Previous">

<span aria_hidden="true">«</span></a>

</li>

{% endif %}

{% for page_num in articles.paginator.page_range %}

{% if page_num == articles.number %}

<li class="active"><a href="?page={{ page_num }}">{{page_num}}</a> </li>

{% else %}

<li class=""><a href="?page={{ page_num }}">{{page_num}}</a> </li>

{% endif %}

{% endfor %}

{% if articles.has_next %}

<li class="">

<a href="?page={{ articles.next_page_number }}" aria-label="Next">

<span aria_hidden="true">»</span></a>

</li>

{% endif %}

</ul>

</nav>

</div>

Django如何在基于类的视图里使用分页?

上述案例里我们使用了函数试图,很容易定义page对象, 并传递给模板,例如articles。但是如果我们希望使用基于类的视图,我们该如何实现分页呢?其实操作非常简单。我们只需在视图中加入paginate_by = number即可。

from. models import Article

from django.views.generic import ListView

class ArticleListView(ListView):

model = Article  # 等于 queryset = models.Article.objects.all()

template_name = 'app/article_list.html'  # 可选的

context_object_name = "article_list"    # 默认context名字

paginate_by = 10  # 每页10项

此时模板article_list.html也需要做出相应调整,如下图所示。Django会先对是否分页is_paginated做个判断,如果有,就会自动生成个page_obj分页对象传递到模板。

{% if article_list %}

{% for article in article_list %}

{{ article.title }}

{% endfor %}

{% if is_paginated %}

<ul class="pagination">

{% if page_obj.has_previous %}

<li>

<span><a href="?page={{ page_obj.previous_page_number }}">Previous</a></span>

</li>

{% endif %}

<li class="">

<span>Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}.</span>

</li>

{% if page_obj.has_next %}

<li>

<span><a href="?page={{ page_obj.next_page_number }}">Next</a></span>

</li>

{% endif %}

</ul>

{% else %}

<h3>Articles</h3>

<p>No article yet</p>

{% endif %}

Django 分页器的更多相关文章

  1. Django分页器的设置

    Django分页器的设置 有时候在页面中数据有多条时很显然需要进行分页显示,那么在python中django可以这样设置一个分页处理 怎么样去设置呢? 我们要用到  Django  中的  Pagin ...

  2. Django 分页器的使用

    Django 分页器的使用 Django作为Python Web开发框架的一哥,提供了企业级网站开发所需要的几乎所有功能,其中就包括自带分页功能.利用Django自带的Paginator类,我们可以很 ...

  3. Django分页器和自定义分页器

    一.自定义分页器 import copy class Pagination(): def __init__(self,request,current_page,all_data_num,each_pa ...

  4. django -----分页器组件

    分页器组件 本文目录 1 Django的分页器(paginator)简介 2 应用View层 3 模版层 index.html 4 扩展 回到目录 1 Django的分页器(paginator)简介 ...

  5. Django 2.0 学习(19):Django 分页器

    Django 分页器 要使用Django实现分页功能,必须从Django中导入Paginator模块(painator - 分页器) views.py from django.shortcuts im ...

  6. Django - Cookie、Session、自定义分页和Django分页器

    2. 今日内容 https://www.cnblogs.com/liwenzhou/p/8343243.html 1. Cookie和Session 1. Cookie 服务端: 1. 生成字符串 2 ...

  7. Django 分页器 缓存 信号 序列化

    阅读目录 分页器 缓存 信号 序列化 Django分页器  (paginator) 导入 from django.core.paginator import Paginator, EmptyPage, ...

  8. django分页器

    网站页面的分页效果可以通过分页器实现 分页器的使用 urls.py from django.contrib import admin from django.urls import path from ...

  9. 7.Django|分页器

    Django的分页器paginator 文件为pageDemo models.py from django.db import models # Create your models here. cl ...

  10. 7 Django分页器文章分页

    1.复习 2.这节课要解决的问题? 3.分页的原理 4.准备工作 (1)创建Django项目 C:\Users\Administrator\Desktop\root3>django-admin ...

随机推荐

  1. es6 语法 (Proxy和Reflect 的对比)

    { //原始对象 let obj={ time:'2017-03-11', name:'net', _r:123 }; //(代理商)第一个参数代理对象,第二个参数真正代理的东西 let monito ...

  2. 矢量图面层和线层相交得到相交后的线层文件(gis相交)

    目的:将arcgis里的面层和线层相交(重叠)部分的线单独生成一个shp文件,用于道路路网密度计算等. 注意:进行相交运算后生成的是线要素文件,相当于把面线相交部分的线单独拿了出来. 操作例子:将图示 ...

  3. Ubuntu快捷键、Ubuntu终端常用命令

    Ubuntu快捷键 0.Ctrl + Alt + t 打开终端,在终端命令行操作 1. Ctrl + W: 关闭当前 Nautilus 窗口 2. Ctrl+T: 在 Nautilus 打开新的 Ta ...

  4. iOS开发GCD(3)-数据安全

    /* 多个线程可能访问同一块资源,造成数据错乱和数据安全问题 为代码添加同步锁(互斥锁) */ -(void)synchronized{ @synchronized(self){ //需要锁住的代码, ...

  5. Apktool(3)——Apktool的使用

    一.apktool的作用 安卓应用apk文件不仅仅是包含有resource和编译的java代码的zip文件,如果你尝试用解压工具(如好压)解压后,你将会获得classes.dex和resource.a ...

  6. git 入门教程之变基合并

    git 鼓励大量使用分支---"早建分支!多用分支!",这是因为即便创建再多的分支也不会造成存储或内存开销,并且分支的作用有助于我们分解逻辑工作,这样一样其实比维护单一臃肿分支要简 ...

  7. (网页)习惯了CS回车操作人员,操作BS网页表单也是回车666

    1.第一步把表单,里面需要回车的input,或者是其他的表单按钮给一个clsss,例如下面的$('.cls'); 2.第二步,  把下面的代码复制过去,填写完最后一个自动提交:$("#sav ...

  8. IPD咨询如何才能真正落地?

    文/资深顾问 杨学明 IPD作为先进的产品开发理念,思想起源于PRTM公司,PACE,培思的力量,首先在IBM和波音公司迅速完善,中国是深圳华为公司. 1992年IBM公司利润停止增长,财务困难,IB ...

  9. RMAN restore fails with ORA-01180: can not create datafile 1

      最近在验证.测试备份有效性时,遇到了"ORA-01180: can not create datafile 1"这个错误,顺便结合metalink的官方文档"RMAN ...

  10. 将 varchar 值 'ACCE5057EC423F7C' 转换成数据类型 int 时失败

    调试别人的存储过程,然后报错了 将 varchar 值 'ACCE5057EC423F7C' 转换成数据类型 int 时失败 这让我一通找.找了一个多小时. 通过这个错可以知道,错误肯定是在联表 字段 ...