玩转Django分页器

在这里插入图片描述

一、Pagination 分页器编程步骤

  1. View, 导入django.core.paginator.Paginator类,创建Paginator 对象时,输入qs对象,以及每页显示条数。

  2. 接收 URL, 从请求参数中读取page数值 ,通过 paginator.page(page_num) 返回请求页的page_obj.

  3. 模板中,用page_obj的属性来编写分页器HTML代码

分页器功能的两个主要数据结构: Paginator 对象, Page对象。

参考实例: https://simpleisbetterthancomplex.com/tutorial/2016/08/03/how-to-paginate-with-django.htmlexample

from django.core.paginator import Paginator #import Paginator

def movies(request):
	movies = Movie.objects.all() #queryset containing all movies we just created
	paginator = Paginator(movies, 3)  # 每页3行记录
	page_number = request.GET.get('page')
	page_obj = paginator.get_page(page_number)
	return render(request=request, template_name="main/movies.html", context={'movies':page_obj})

在这里插入图片描述

二、Paginator 对象

paginator 类对象的属性

per_page 每页显示条数。

count, num_pages

page_range, 页面的迭代器

Paginator 对象的方法

Paginator.get_page(number) 返回 page_obj , 页号从1开始

Paginator.page(number) 同上。

三、 Page对象

主要属性

object_list , 即queryset 数据

number, 当前页号

previous_page_number, next_page_number

主要方法

has_next(), has_previous(), next_page_number(), 等, page2.previous_page_number()

>>> page1 = p.page(1)
>>> page1
<Page 1 of 2>
>>> page2 = p.get_page(2)

>>> page2.has_next()
False
>>> page2.has_previous()
True
>>> page2.has_other_pages()
True
>>> page2.next_page_number()
Traceback (most recent call last):
...
EmptyPage: That page contains no results
>>> page2.previous_page_number()
>>> page2.start_index()  # The 1-based index of the first item on this page
3
>>> page2.end_index()  # The 1-based index of the last item on this page
4

三、分页功能实现

1、URL请求参数携带 page 参数

如:

http://127.0.0.1:8000/books/borrow/?page=1

2、视图中实现分页器,返回页面对象

from django.core.paginator import Paginator #import Paginator

def movies(request):
	movies = Movie.objects.all() #queryset containing all movies we just created
	paginator = Paginator(movies, 10)  # 每页10行记录
	page_number = request.GET.get('page')
	page_obj = paginator.get_page(page_number)
	return render(request=request, template_name="main/movies.html", context={'movies':page_obj})

说明:

 paginator = Paginator(movies, 10)  # 每页10行记录

表示创建分页器对象,构造器传入查询结果,以及每页显示行数。

page_number = request.GET.get('page')
page_obj = paginator.get_page(page_number)

请求参数page表示请求的页号,获取该页的页面对象page_obj

return render(request=request, template_name="main/movies.html", context={'movies':page_obj})

将page_obj 页面对象做为context上下文传给模板渲染。

3、模板中实现分页器渲染

数据列表显示部分

page_obj 页面对象中包含了当前页的object对象列表,用 for …in… 遍历。

{% for obj in page_obj %}
   {{ obj.name }} 

{% endfor %}`
分页器栏用用a标签实现分页器跳转

Page对象传入模板后,需要编写html分页器代码,判断是否有上下页, 并传回下次请求的页号

    <div class='pagination'>
        <span class="step-links">
            {% if page_obj.has_previous %}
                <a href="?page=1">&laquo; 首页</a>
                <a href="?page={{ page_obj.previous_page_number }}">上页</a>    
            {% endif %}
            
            <span class="current">
                当前页 {{ page_obj.number }} / {{ page_obj.paginator.num_pages }}.
            </span>

            {% if page_obj.has_next %}
                <a href="?page={{ page_obj.next_page_number }}">下页</a>
                <a href="?page={{ page_obj.paginator.num_pages }}">末页 &raquo;</a>
            {% endif %}
    </div>

4、支持用户自定义每页显示行数

有时,用户希望自己控制每页显示行数,可以在GET请求参数中,携带 page_size=xxx, 如

http://127.0.0.1:8000/books/borrow/?page=1&page_size=20

视图函数中,令 paginator.per_page = request.GET[‘page_size’], 即可支持前端修改每页显示条数。

模板中添加1个input标签,监听到 change 事件后,将page_size拼接在地址后面,发送请求到服务器。

    <script>
        var input = document.getElementById("pagesize");
        function handleChange(e){
            window.location.href="http://127.0.0.1:8000/books/borrow/?page=1&page_size="+input.value
        }
    </script>

完整示例代码

views.py

from django.core.paginator import Paginator
from django.shortcuts import render
from myapp.models import *


def listing(request):
    qs = Borrow.objects.all()
    paginator = Paginator(qs, 25)  # Show 25 contacts per page.
    if 'page_size' in request.GET.keys(): 
        paginator.per_page = request.GET['page_size'],
    page_number = request.GET.get("page")
    page_obj = paginator.get_page(page_number)
    return render(request, "list.html", {"page_obj": page_obj})

对于通用视图, 重载get()方法

class BorrowListView(ListView):
    model = Borrow
    template_name = "books/borrow_list.html"
    paginate_by = 10      # 默认传至template的context名称为page_obj

    def get(self, request, *args, **kwargs):
        if 'page_size' in request.GET.keys():
            self.paginate_by = request.GET['page_size']
        return super().get(request, *args, **kwargs)

list_contact.html

{% extends "myapp/base.html" %}

{% block content %}
{% for obj in page_obj %}
    {{ obj.name }}<br>
    ...
{% endfor %}

<div class='pagination'>
        <span class="step-links">
            {% if page_obj.has_previous %}
                <a href="?page=1">&laquo; 首页</a>
                <a href="?page={{ page_obj.previous_page_number }}">上页</a>    
            {% endif %}
            
            <span class="current">
                当前页 {{ page_obj.number }} / {{ page_obj.paginator.num_pages }}.
            </span>

            {% if page_obj.has_next %}
                <a href="?page={{ page_obj.next_page_number }}">下页</a>
                <a href="?page={{ page_obj.paginator.num_pages }}">末页 &raquo;</a>
            {% endif %}
            <span style='margin-left: 20px;'>每页显示<span>
            <input type='number' min=10 max=100 id="pagesize" style="width: 40px;" onchange='handleChange()' /><span>条记录</span>

    </div>
    <script>
        var input = document.getElementById("pagesize");
        function handleChange(e){
            window.location.href="http://127.0.0.1:8000/books/borrow/?page=1&page_size="+input.value
        }
    </script>
 {% endblock content %}

最终显示如下
在这里插入图片描述

  • 14
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Django是一个使用Python编写的Web应用程序框架,它提供了许多强大的工具和功能来帮助开发人员快速构建高效的Web应用程序。 要玩转Django 2.0代码,首先需要安装Django 2.0,并且熟悉其基本的目录结构和文件组织方式。在创建一个新的Django项目时,可以使用命令行工具来生成基本的项目结构,然后在其中创建应用程序并定义模型、视图和模板。 在使用Django 2.0开发Web应用程序时,需要熟悉Django的MTV(模型-模板-视图)架构,这是Django应用程序的核心概念。模型用于定义数据结构和处理数据库操作,视图负责处理用户请求并返回响应,模板则用于生成最终的用户界面。 此外,了解如何使用Django 2.0的路由系统来处理URL映射和视图函数的调度也非常重要。可以使用Django的路由配置来定义URL模式,并将它们映射到相应的视图函数上。 另外,了解Django 2.0的表单处理、认证和权限管理功能也是必不可少的。Django提供了丰富的表单组件和验证工具,可以帮助开发人员快速构建复杂的表单。而用户认证和权限管理方面,Django提供了强大的认证和授权系统,可以帮助开发人员轻松实现用户注册、登录和权限控制。 总之,要玩转Django 2.0代码,需要深入了解Django的核心概念和功能,并且通过实际的项目实践来提升自己的编码技巧和经验。希望以上回答能帮助你更好的学习和应用Django 2.0。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值