Django自定制分页功能

URL:

"""django_paginner URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/2.1/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path(‘‘, views.home, name=‘home‘)
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path(‘‘, Home.as_view(), name=‘home‘)
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path(‘blog/‘, include(‘blog.urls‘))
"""
from django.contrib import admin
from django.urls import path
from app01 import views

urlpatterns = [
    path(‘admin/‘, admin.site.urls),
    path(‘index/‘, views.index),
    path(‘index1/‘, views.index1),

]

views:

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

# Create your views here.
USER_LIST = []

for i in range(1, 659):
    temp = {‘name‘: ‘root‘ + str(i), ‘age‘: i}
    USER_LIST.append(temp)

def index(request):
    # 当前的页数
    current_page = request.GET.get(‘p‘)
    # 每页显示10个
    per_page_count = 10

    # 第一页(0,10)索引是0到9
    # 第二页(10,20)索引是10到19

    current_page = int(current_page)
    # 开始:当前页-1*每页显示10个
    # 第二页
    # (2-1)*10
    start = (current_page - 1) * per_page_count
    # 2*10
    end = current_page * per_page_count
    data = USER_LIST[start:end]

    if current_page <= 1:
        prev_page = 1
    prev_page = current_page - 1
    next_page = current_page + 1

    return render(request, ‘index.html‘, {‘user_list‘: data, ‘prev_page‘: prev_page, ‘next_page‘: next_page})

class CustomPaginator(Paginator):
    def __init__(self, current_page, per_pager_num, *args, **kwargs):
        # 当前页
        self.current_page = int(current_page)
        # 每页最多显示页码数量
        self.per_page_num = int(per_pager_num)
        super(CustomPaginator, self).__init__(*args, **kwargs)

    def pager_num_range(self):
        # 当前页
        # self.current_page
        # 每页最多能显示的页码数量,漂亮最好取奇数 11
        # self.per_page_num
        # 总页数
        # self.num_pages

        # 总页数是django分页功能根据数据大小自动分配好的
        # 如果总页数小于每页最多能显示的页码数量
        # 那么就返回range(第一页到总页数+1),因为range取值是取(开头,结尾-1)
        if self.num_pages < self.per_page_num:
            return range(1, self.num_pages + 1)

        # 总页数特别多
        # 当你的当前页 小于或等于,最多显示的页数的一半时,显示前五个,后五个
        part = int(self.per_page_num / 2)
        if self.current_page <= part:
            # return range(1, part + 1)
            return range(1, self.per_page_num + 1)
        # 极限值:如果当前页+最多显示页数一半>总页数(超出了显示的范围)
        # 返回range(总页数-最多显示的页数,总页数+1)
        if (self.current_page + part) > self.num_pages:
            return range(self.num_pages-self.per_page_num, self.num_pages + 1)
        # if self.current_page > part:
        return range(self.current_page - part, self.current_page + part + 1)

def index1(request):
    # 全部数据:USER_LIST=得出共有多少条数据
    # 10,
    # per_page: 每页显示条目数量
    # count:    数据总个数
    # num_pages:总页数
    # page_range:总页数的索引范围,如: (1,10),(1,200)
    # page:     page对象(是否具有下一页;是否有上一页)
    current_page = request.GET.get(‘p‘)

    paginator = CustomPaginator(current_page, 7, USER_LIST, 10)
    try:
        posts = paginator.page(current_page)
        # has_next              是否有下一页
        # next_page_number      下一页页码
        # has_previous          是否有上一页
        # previous_page_number  上一页页码
        # object_list           分页之后的数据列表
        # number                当前页
        # paginator             paginator对象
    except PageNotAnInteger:
        posts = paginator.page(1)
    except EmptyPage:
        posts = paginator.page(paginator.num_pages)
    return render(request, ‘index1.html‘, {‘posts‘: posts})

templates-index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
        <ul>
        {% for row in posts.object_list  %}
            <li>{{ row.name }}-{{ row.age }}</li>
        {% endfor %}
        </ul>

        {% include ‘include/pager.html‘ %}
</body>
</html>

pager.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

{% if posts.has_previous %}
    <a href="/index1?p={{ posts.previous_page_number }}">上一页</a>
{% else %}
    <a href="#">上一页</a>
{% endif %}

{% for i in posts.paginator.pager_num_range %}
    {% if i == posts.number %}
        <a style="font-size: 30px;" href="/index1?p={{ i }}">{{ i }}</a>
    {% else %}
        <a href="/index1?p={{ i }}">{{ i }}</a>
    {% endif %}
{% endfor %}

{% if posts.has_next %}
    <a href="/index1/?p={{ posts.next_page_number }}">下一页</a>
{% else %}
    <a href="#">下一页</a>
{% endif %}
<span>
            {{ posts.number }}/{{ posts.paginator.num_pages }}
        </span>

</body>
</html>

原文地址:https://www.cnblogs.com/ago-0912/p/10017368.html

时间: 2024-10-10 19:44:07

Django自定制分页功能的相关文章

django中orm分页功能(内置分页)

分批获取数据的方法 数据库方法 models.Uinfo.objects.all()[10:20] django自带的方法 创建一个新的url urlpatterns = [ url(r'^index.html/', views.index), ] 创建index函数 def index(request): """ 分页功能 :param request: :return: """ user_list = models.Uinfo.objects

Django自带分页功能

直接上代码: models.py django.db models Asset(models.Model):     OS_CHOICE = [         (, ),         (, ),         (, ),         (, ),         (, ),     ]     hostname = models.CharField(=, =, =)     ip = models.GenericIPAddressField(=, =)     port = model

django网页的分页功能,大家如果有疑问请留言

url文件 from django.contrib import admin from django.conf.urls import url from app01 import views urlpatterns = [ url(r'^user_list', views.user_list) ] 对views文件 def user_list(request): pagesizenumber = request.COOKIES.get('pagesizenumber', 10) #获取COOKI

django 自带分页

使用django 自带分页功能: from django.core.paginator import Paginator,EmptyPage,PageNotAnInteget EmptyPage 是在超出页数时改怎么做 PageNotAnInteget 使用在异常中出现错误的时候该怎么做 objs = [1,2,3,4,5,6,7,8,9] p = Paginator(objs,3) 每页显示3个 p.count 打印的是 objs里有多少个内容 p.num_pages 显示有多少页 p.pag

django之快速分页

本文介绍djanog两种分页,第一是普通分页,第二是使用haystack全文检索的分页. 1.django自带分页功能,这个功能非常好用.基本知识点:Django提供了数据分页的类,这些类被定义在django/core/paginator.py中对象Paginator用于对列进行一页n条数据的分页运算对象Page用于表示第m页的数据Paginator对象 方法init(列表,int):返回分页对象,参数为列表数据,每面数据的条数属性count:返回对象总数属性num_pages:返回页面总数属性

django高级应用(分页功能)

django高级应用(分页功能) 1.原生分页应用 前端html代码 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Title</title> 6 </head> 7 <body> 8 <ul> 9 {% for item in posts.obj

django分页功能,templatetags的应用

django 将不会将得到的html代码自动转化 from django.utils.html import format_html html =''' <a href='http://www.china.cn'>中国</a>''' format_html(html) django分页 分页功能基本操作 from django.core.import Paginator li=[11,12,13,22,24,25] p=Paginator(li,3) #将li传入,每页显示3条 p

{oldboy-django][2深入django]分页功能

1 django自带分页 1.1 分页模板 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <link rel="stylesheet" href="/static/plugins/bootstrap-3.3.7-dist/css/boots

django实现分页功能

在个人博客或者网站上,我们发表文章经常会对博客进行分页,下面代码用django实现: django有它自带的分页功能:Paginator 不过我们用在它基础上开发的另一个包:django-pure-pagination 先了解一下这个包特性: 1.使用与django.core相同的API,因此与现有代码完全兼容. 2.它考虑了现有的GET参数,具有动态查询字符串创建. 3.用html呈现分页功能,开箱即用(方便) 4.使呈现更高级的分页模板更加容易. 使用: 一.安装 在虚拟环境中通过pip安装