django(18)、分页组件开发

目录

  • 原生Paginator
  • 利用bootstrap改进Paginator
  • Pure_Pagination

原生Paginator

urls.py

from django.conf.urls import include, url
from app01 import views as app01_views

urlpatterns = [
    url(r'^index/$', app01_views.index),
]

views.py

from django.core.paginator import EmptyPage, PageNotAnInteger, Paginator
from django.shortcuts import render
from .models import Publisher

def index(request):
    publishers = Publisher.objects.all()
    paginator = Paginator(publishers, 2)  # 每页三条数据
    page = request.GET.get('page')

    try:
        contacts = paginator.page(page)
    except PageNotAnInteger:
        # If page is not an integer, deliver first page.
        contacts = paginator.page(1)
    except EmptyPage:
        # If page is out of range (e.g. 9999), deliver last page of results.
        contacts = paginator.page(paginator.num_pages)

    return render(request, 'index.html', locals())

index.html

<!DOCTYPE html>
<html lang="en">
{% load static %}
<head>
    <meta charset="UTF-8">
    <title>index</title>
    <link rel="stylesheet" href="{% static 'css/bootstrap.min.css' %}">
</head>
<body>

<div class="container">
    <h2>机构列表</h2>
    <div class="row">
        <table class="table table-striped">
            <tr>
                <td>机构名称</td>
                <td>机构地址</td>
            </tr>
            {% for p in contacts.object_list %}
            <tr>
                <td>{{ p.title }}</td>
                <td>{{ p.address }}</td>
            </tr>
            {% endfor %}
        </table>

        <div class="pagination">
            <span class="step-links">
                {% if contacts.has_previous %}
                    <a href="?page={{ contacts.previous_page_number }}">previous</a>
                {% endif %}

                <span class="current">
                    Page {{ contacts.number }} of {{ contacts.paginator.num_pages }}.
                </span>

                {% if contacts.has_next %}
                    <a href="?page={{ contacts.next_page_number }}">next</a>
                {% endif %}
            </span>
        </div>
    </div>
</div>
</body>
</html>

页面展示


利用bootstrap改进Paginator

参考:https://v3.bootcss.com/components/#pagination-default

index.html

<!DOCTYPE html>
<html lang="en">
{% load static %}
{% load my_tag %}
<head>
    <meta charset="UTF-8">
    <title>index</title>
    <link rel="stylesheet" href="{% static 'css/bootstrap.min.css' %}">
</head>
<body>

<div class="container">
    <h2>机构列表</h2>
    <div class="row">
        <table class="table table-striped">
            <tr>
                <td>机构名称</td>
                <td>机构地址</td>
            </tr>
            {% for p in contacts.object_list %}
            <tr>
                <td>{{ p.title }}</td>
                <td>{{ p.address }}</td>
            </tr>
            {% endfor %}
        </table>

        <nav aria-label="Page navigation">
          <ul class="pagination">
            <li>
                {% if contacts.has_previous %}
                    <a href="?page={{ contacts.previous_page_number }}">上一页</a>
                {% endif %}
            </li>

            {% pager_list contacts %}

            <li>
                {% if contacts.has_next %}
                    <a href="?page={{ contacts.next_page_number }}">下一页</a>
                {% endif %}
            </li>
          </ul>
        </nav>

    </div>
</div>
</body>
</html>

my_tag.py

from django.template import Library
from django.utils.safestring import mark_safe

register = Library()

@register.simple_tag
def pager_list(contacts):
    pager_str = ''
    for i in range(contacts.paginator.num_pages):
        active = ''

        # 若为当前页面页码,则高亮显示
        if contacts.number == i + 1:
            active = 'active'

        li_str = '<li class=%s><a href="?page=%s">%s</a></li>'                  % (active, i + 1, i + 1)

        pager_str += li_str
    return mark_safe(pager_str)

改进后显示

弊端

当数据很大,页码数量过多,那么一次性就不能将页码都显示出来。


Pure_Pagination

安装模块:

  • 源码下载:https://github.com/jamespacileo/django-pure-pagination
  • 利用pip安装下载后的zip文件。

setting.py

INSTALLED_APPS = (
    'pure_pagination',
)

PAGINATION_SETTINGS = {
    'PAGE_RANGE_DISPLAYED': 3,
    'MARGIN_PAGES_DISPLAYED': 2,
    'SHOW_FIRST_PAGE_WHEN_INVALID': True,
}

PAGE_RANGE_DISPLAYED is the number of pages neighbouring the current page which will be displayed (default is 10)

MARGIN_PAGES_DISPLAYED is the number of pages neighbouring the first and last page which will be displayed (default is 2)

views.py

from django.shortcuts import render
from .models import Publisher
from pure_pagination import Paginator, EmptyPage, PageNotAnInteger

def index(request):
    publishers = Publisher.objects.all()

    try:
        # 获取页码数
        page = request.GET.get('page', 1)
    except PageNotAnInteger:
        page = 1

    p = Paginator(publishers, request=request, per_page=1)
    contacts = p.page(page)

    return render(request, 'index.html', locals())

index.html

方式1:没有任何样式

{{ contacts.render }}

方式2:

<!DOCTYPE html>
<html lang="en">
{% load static %}
{% load my_tag %}
<head>
    <meta charset="UTF-8">
    <title>index</title>
    <link rel="stylesheet" href="{% static 'css/bootstrap.min.css' %}">
</head>
<body>

<div class="container">
    <h2>机构列表</h2>
    <div class="row">
        <table class="table table-striped">
            <tr>
                <td>机构名称</td>
                <td>机构地址</td>
            </tr>
            {% for p in contacts.object_list %}
            <tr>
                <td>{{ p.title }}</td>
                <td>{{ p.address }}</td>
            </tr>
            {% endfor %}
        </table>

    {% load i18n %}
    <nav >
        <ul class="pagination{% if size %} pagination-{{ size }}{% endif %}">
            {% if contacts.has_previous %}
                <li class="previous">
                    <!--此处携带当前页的过滤字段参数,-->
                    <a href="?{{ contacts.previous_page_number.querystring }}"
                       aria-label="{% trans 'previous page' %}">
                        <span aria-hidden="true">上一页</span>
                        {% if verbose %}<span class="hidden-xs">{% trans 'previous page' %}</span>{% endif %}
                    </a>
                </li>
            {% else %}
                <li class="previous disabled">
                    <span>
                        <span aria-hidden="true">上一页</span>
                        {% if verbose %}<span class="hidden-xs">{% trans 'previous page' %}</span>{% endif %}
                    </span>
                </li>
            {% endif %}

            {% for page in contacts.pages %}
                {% if page %}
                    {% if page == contacts.number %}
                        <li class="active">
                            <a href="?{{ page.querystring }}">{{ page }} <span
                                    class="sr-only">({% trans 'current page' %})</span></a>
                        </li>
                    {% else %}
                        <li>
                            <a href="?{{ page.querystring }}">{{ page }}</a>
                        </li>
                    {% endif %}
                {% else %}
                    <li class="disabled">
                        <span>...</span>
                    </li>
                {% endif %}
            {% endfor %}

            {% if contacts.has_next %}
                <li class="next">
                    <a href="?{{ contacts.next_page_number.querystring }}" aria-label="{% trans 'next page' %}">
                        {% if verbose %}<span class="hidden-xs">{% trans 'next page' %}</span>{% endif %}
                        <span aria-hidden="true">下一页</span>
                    </a>
                </li>
            {% else %}
                <li class="next disabled">
                    <span>
                        {% if verbose %}<span class="hidden-xs">{% trans 'next page' %}</span>{% endif %}
                        <span aria-hidden="true">下一页</span>
                    </span>
                </li>
            {% endif %}
        </ul>
    </nav>

    </div>
</div>
</body>
</html>

5、最终效果展示

原文地址:https://www.cnblogs.com/fqh202/p/9456602.html

时间: 2024-07-31 15:37:21

django(18)、分页组件开发的相关文章

DJANGO 自定义分页组件

第一次在码云上面分享代码片段,记录一下: https://gitee.com/trunkslisa/codes/14gkxi3zf9e2ulbvjnqyo90 class Pagination(object): def __init__(self, totalCount, currentPage, perPageNum=20, maxPageNum=7): # 传入: # -所有数据的个数 totalCount self.totalCount = totalCount # -当前页 curren

django 分页组件

一.仿django分页功能自己实现 urls.py 1 2 3 4 5 6 7 8 9 from django.conf.urls import url from django.contrib import admin from app01 import views urlpatterns = [     url(r'^admin/', admin.site.urls),     url(r'^index.html$', views.index),     ] views.py 1 2 3 4

Django框架(十五)—— Django分页组件

Django分页组件 一.分页器 数据量大的话,可以分页获取,查看 例如:图书管理中,如果有成千上万本书,要是都在一个页面中渲染出来,会影响页面美观,所以就要用分页器分页渲染 二.分页器的使用 基本写法 基本写法: 后端: 总数据拿出来 生成分页器Paginator对象(对象里有属性和方法) 生成当前页的对象,current_page=paginator.page(当前页码) 取出前台传过来的页码,current_page_num = int(request.GET.get('page')) -

8.2 Django 分页组件替换自定义分页

Django的分页器(paginator) 总之不太好用我们还是用自己的好一些 自定义分页器 分页实现源码 """ 自定义分页组件 """ class Pagination(object): def __init__(self, current_page, all_count, base_url, params, per_page_num=8, pager_count=11, ): """ 封装分页相关数据 :par

Django的rest_framework的分页组件源码分析

前言: 分页大家应该都很清楚,今天我来给大家做一下Django的rest_framework的分页组件的分析:我的讲解的思路是这样的,分别使用APIview的视图类和基于ModelViewSet的视图类两种方式实现分页的功能,同时我也会介绍两个分页的类,PageNumberPagination类和LimitOffsetPagination,希望能对大家有所帮助! 今天的博客主要的这样的,先讲解基于APIView类的两种分页类的实现方式,然后在讲解基于ModelViewSet类的两种分页类的实现方

[js开源组件开发]ajax分页组件

ajax分页组件 我以平均每一周出一个开源的js组件为目标行动着,虽然每个组件并不是很庞大,它只完成某一个较小部分的工作,但相信,只要有付出,总会得到回报的.这个组件主要完成分页的工作. 这张图里显示的是这个分页控件的两种基本形态,样式可以自己定制,包括文案内容. 这个分页控件的demo演示地址是: http://www.lovewebgames.com/jsmodule/paging.html 同时,它还是开源的,它的git 地址是:https://github.com/tianxiangbi

如何使用 Docker 组件开发 Django 项目?

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.自2013年发布以来,无论是从 Github 上的代码活跃度,还是 Redhat 在 RHEL6.5 中集成对 Docker 的支持, 就连 Google 的 Compute Engine 也支持 Docker 在其之上运行.火热程度可见一斑! 本篇文章详细介绍了如何通过 Docker Machine 「系统配置」和 Docker Comp

打通前后端全栈开发node+vue进阶【课程学习系统项目实战详细讲解】(3):用户添加/修改/删除 vue表格组件 vue分页组件

第三章 建议学习时间8小时      总项目预计10章 学习方式:详细阅读,并手动实现相关代码(如果没有node和vue基础,请学习前面的vue和node基础博客[共10章] 演示地址:后台:demoback.lalalaweb.com  前台:demo.lalalaweb.com 演示过程中可能会发现bug,希望即时留言反馈,谢谢 源码下载:https://github.com/sutianbinde/classweb               //不是全部的代码,每次更新博客才更新代码 学

Django之Form组件

Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 小试牛刀 1.创建Form类 from django.forms import Form from django.forms import widgets from django.forms import fields class MyForm(Form): user = fields.CharField( widget=widgets.Tex