django分页器的一些思考

今天用django写了两个分页器,实现的思路并不一样,发现二者各有利弊

第一种方法:从数据库获取数据,在后端用字符串格式化的方法做成HTML语句,然后传到前端进行渲染

代码如下

views

username = req.session[‘username‘]

        currunt_page=req.GET.get("page", 1)
        currunt_page=int(currunt_page)
        end_page=currunt_page*10
        start_page=end_page-10

        class_list = models.Class.objects.all()[start_page:end_page]
        total_count=models.Class.objects.all().count()
        page_num, odd=divmod(total_count, 10) 

        page_list=[]

        if odd != 0:
            page_num+=1

        if currunt_page <= 5:
            page_start = 1
            page_end = 11
        elif currunt_page >= page_num - 5 and currunt_page<=page_num:
            page_start = page_num - 10
            page_end = page_num
        else:
            page_start = currunt_page - 5
            page_end = currunt_page + 5

        if currunt_page==1:
            page_list.append("<a href=‘/class_manage.html?page=%s‘>上一页</a>" % (currunt_page))
        else:
            page_list.append("<a href=‘/class_manage.html?page=%s‘>上一页</a>" % (currunt_page-1))

        for i in range(page_start, page_end+1):
            if i == currunt_page:
                page_list.append("<a class=‘active‘ href=‘/class_manage.html?page=%s‘>%s</a>"%(i,i,))
            else:
                page_list.append("<a href=‘/class_manage.html?page=%s‘>%s</a>"%(i,i,))

        if currunt_page==page_num:
            page_list.append("<a href=‘/class_manage.html?page=%s‘>下一页</a>" % (currunt_page))
        else:page_list.append("<a href=‘/class_manage.html?page=%s‘>下一页</a>" % (currunt_page+1))
        pager="".join(page_list)

        return render(req, ‘class_manage.html‘, {‘username‘: username,"class_list":class_list,"page_list":pager})

html

<div class="page">
            {{ page_list|safe }}
</div>

第二种方法:在后端生成数据包传到前端,使用for循环进行渲染(传输数据时,假设current_page和page_list已构造成一个字典)

user = request.session.get("user")
    cla_list = models.Class.objects.all()

    count = cla_list.count()
    current_page = request.GET.get("page", 1)
    current_page=int(current_page)
    opt= request.GET.get("opt",None)
    page_num, last = divmod(count, 10)

    page_list = []

    if last!=0:
        page_num += 1

    if current_page != 1 and current_page != page_num:
        if opt == "‘next‘":
            current_page+=1
        elif opt == "‘last‘":
            current_page-=1
    if current_page == 1 and opt == "‘next‘":
        current_page += 1
    elif current_page == page_num and opt == "‘last‘":
        current_page -= 1

    if current_page<=5:
        for i in range(1, 11):
            page_list.append(i)
    elif current_page>=page_num-5:
        for i in range(page_num-10, page_num+1):
            page_list.append(i)
    else:
        for i in range(current_page-5, current_page+6):
            page_list.append(i)

    cla_list_send = []

    for item in cla_list[(current_page-1)*10:current_page*10]:
        cla_list_send.append(item)

    return render(request,"classes.html",{"user":user, "cla_list":cla_list_send,"page_list":page_list,"current_page":current_page})

html

<a href="/cla_manage?page={{ current_page }};opt=‘last‘">上一页</a>
<span>
{% for i in page_list %}
    <a href="/cla_manage?page={{ i }}">{{ i }}</a>
{% endfor %}
</span>
<a href="/cla_manage?page={{ current_page }};opt=‘next‘">下一页</a>

由于这里只对两种思路进行探讨,所以只选取了部分代码,所以希望看到这篇文章的人不必过于关注代码细节

下面讨论两种方式的利弊:

1. 从复杂度来说:这两种方式在算法复杂度上相差不大(这里要注意django在前端代码中写的for循环语句,本质还是在后端先进行了迭代,然后django会自己生成html代码然后发送到前端)

2. 从封装调用来说:如果在后端将二者进行封装,在接口方面而这需要传入的参数相差不大,但是在调用时明显第二种不够友好,因为对于前端来说要调用许多数据

3. 从亲后端分离来说:第二种做到了前后端分离,而第一种需要在后端写html代码

自己更倾向于第一种,当然分页器第一次接触,还未进行更加深入的思考,这篇文章来日还要再进行总结。

原文地址:https://www.cnblogs.com/Rongze-blog/p/9780438.html

时间: 2024-10-09 12:58:48

django分页器的一些思考的相关文章

Django分页器

一 Django的分页器(paginator)简介 在页面显示分页数据,需要用到Django分页器组件,Django提供了一些类来帮助您管理分页数据 - 即分布在多个页面上的数据,带有"上一页/下一页"链接 示例 >>> from django.core.paginator import Paginator >>> objects = ['john', 'paul', 'george', 'ringo'] >>> p = Pagin

Django分页器(paginator)组件

Django分页器(paginator)组件 from django.core.paginator import Paginator from django.core.paginator import Paginator 先拿到分页器对象 paginator = Paginator(book_list,3) 第一个参数:对象列表,第二个参数:每页显示的条数 paginator.count 总条数 paginator.num_pages 总页数 paginator.page_range 页码数列表

django -----分页器组件

1 Django的分页器(paginator)简介 2 应用View层 3 模版层 index.html 4 扩展 回到目录 1 Django的分页器(paginator)简介 在页面显示分页数据,需要用到Django分页器组件 from django.core.paginator import Paginator Paginator对象: paginator = Paginator(user_list, 10) # per_page: 每页显示条目数量 # count: 数据总个数 # num

13 django分页器

django分页器 视图函数 1 from django.shortcuts import render,HttpResponse 2 from page_app01.models import Book 3 from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger 4 import math 5 6 # Create your views here. 7 8 9 def pages(request): 10

【前端】Django分页器

一.分页器(paginator) 分页器的使用 >>> from django.core.paginator import Paginator >>> objects = ['john', 'paul', 'george', 'ringo'] >>> p = Paginator(objects, 2) >>> p.count #数据总数 4 >>> p.num_pages #总页数 2 >>> ty

Django分页器及自定义分页器

Django的分页器 view from django.shortcuts import render,HttpResponse # Create your views here. from app01.models import * from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger def index(request): ''' 批量导入数据: Booklist=[] for i in range(

Django—分页器与form组件

目录 分页器 现成分页器代码 如何使用 后端 前端 form组件 form 校验组件 使用校验组件与钩子函数 三种渲染方式 正则校验* 分页器 现成分页器代码 只需要会使用即可. 在Django项目下新建utils文件夹,新建一个py文件,放入封装好的分页器代码. class Pagination(object): def __init__(self, current_page, all_count, per_page_num=10, pager_count=11): """

django分页器paginator使用简单说明

Django之分页功能 Django提供了一个新的类来帮助你管理分页数据,这个类存放在django/core/paginator.py.它可以接收列表.元组或其它可迭代的对象. 基本语法 class Paginator(object):       def __init__(self, object_list, per_page, orphans=0,                  allow_empty_first_page=True):         self.object_list 

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/view