Django 分页器的使用
Django 分页器的使用
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 分页器的使用的更多相关文章
- Django分页器的设置
Django分页器的设置 有时候在页面中数据有多条时很显然需要进行分页显示,那么在python中django可以这样设置一个分页处理 怎么样去设置呢? 我们要用到 Django 中的 Pagin ...
- Django分页器和自定义分页器
一.自定义分页器 import copy class Pagination(): def __init__(self,request,current_page,all_data_num,each_pa ...
- django -----分页器组件
分页器组件 本文目录 1 Django的分页器(paginator)简介 2 应用View层 3 模版层 index.html 4 扩展 回到目录 1 Django的分页器(paginator)简介 ...
- Django 2.0 学习(19):Django 分页器
Django 分页器 要使用Django实现分页功能,必须从Django中导入Paginator模块(painator - 分页器) views.py from django.shortcuts im ...
- Django - Cookie、Session、自定义分页和Django分页器
2. 今日内容 https://www.cnblogs.com/liwenzhou/p/8343243.html 1. Cookie和Session 1. Cookie 服务端: 1. 生成字符串 2 ...
- Django 分页器 缓存 信号 序列化
阅读目录 分页器 缓存 信号 序列化 Django分页器 (paginator) 导入 from django.core.paginator import Paginator, EmptyPage, ...
- django分页器
网站页面的分页效果可以通过分页器实现 分页器的使用 urls.py from django.contrib import admin from django.urls import path from ...
- 7.Django|分页器
Django的分页器paginator 文件为pageDemo models.py from django.db import models # Create your models here. cl ...
- 7 Django分页器文章分页
1.复习 2.这节课要解决的问题? 3.分页的原理 4.准备工作 (1)创建Django项目 C:\Users\Administrator\Desktop\root3>django-admin ...
随机推荐
- java 中Excel的导入导出
部分转发原作者https://www.cnblogs.com/qdhxhz/p/8137282.html雨点的名字 的内容 java代码中的导入导出 首先在d盘创建一个xlsx文件,然后再进行一系列 ...
- 不使用DataContext直接将ViewModels绑定到ItemsControl控件
在常规的MVVM设计模式中,都是通过DataContext将ViewModels的一个对象绑定到View的DataContext中,从而完成相应地绑定,在本文中我们将通过另外的一种思路来将ViewMo ...
- CSS 背景图片 添加 重复和定位。
<!doctype html><html lang="en"> <head> <meta charset="UTF-8" ...
- 五、core开发
一.支付方面的 https://www.cnblogs.com/stulzq/p/7606164.htmlhttps://www.cnblogs.com/guolianyu/
- SQL 给视图赋权限
授予表权限 创建视图 授予视图权限 测试权限 复杂程度: 初级 数据要求: 使用自备的数据 您可以使用 SQL 在企业级地理数据库中创建表和要素类的视图. 本主题中的示例显示如何使用 Microsof ...
- Django models中关于blank与null的补充说明
Django models中关于blank与null的补充说明 建立一个简易Model class Person(models.Model): GENDER_CHOICES=( (1,'Male'), ...
- Spring 使用介绍(九)—— 零配置(二)
三.Bean定义 1.开启bean定义注解支持 开启注解支持须添加以下配置项: <context:component-scan base-package="cn.matt"/ ...
- python之旅六【第七篇】面向对象
面向对象三大特性 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发“更快更好更强... 面向对象编程 ...
- 基于FPGA的数字秒表(数码管显示模块和按键消抖)实现
本文主要是学习按键消抖和数码管动态显示,秒表显示什么的,个人认为,拿FPGA做秒表真是嫌钱多. 感谢 感谢学校和至芯科技,笔者专业最近去北京至芯科技培训交流了一周.老师的经验还是可以的,优化了自己的代 ...
- 【BZOJ1013】【JSOI2008】球形空间产生器 高斯消元
题目描述 有一个\(n\)维空间中的球,告诉你球面上\(n+1\)个点的坐标,求球心的坐标. \(n\leq 10\) 题解 设\(a_{i,j}\)为第\(i\)个点的第\(j\)维坐标,\(i=0 ...