django项目一 分页器(前端分页和后端分页区别)

1. 客户信息展示
  1. 母版和继承
    {% extends 'layout'%}
    {% load static%}
    {% static '文件路径' %}
    block css js content

  2. 内容显示
    普通字段 {{ customer.qq }}
    choices {{ customer.get_class_type_display }}
    多对多 定义方法 返回字符串
    显示状态 定义方法 返回HTML代码段 mark_safe


2. 分页
from django.utils.safestring import mark_safe # 字符串不进行转义
from django.utils.html import format_html

 

前端分页和后端分页

前端分页一般用于数据量较小的情况,一次请求把数据全部从后端请求回来

后端分页适用于数据量偏大时的情况,减小请求传输压力

 

前端分页

前端分页一般用于数据量较小的情况,一次请求把数据全部从后端请求回来。下面是vue-element-ui的分页组件写法:

需要注意的是:

当前页展示的数据与总数据的关系

let show = this.contactsInfo.slice(this.sizePerPage * (this.activePage - 1), this.sizePerPage * (this.activePage));

当每页条数改变时,当前页设置为首页。防止每页条数变大时,当前页时不存在的页数。

 

后端分页

后端分页适用于数据量偏大时的情况,减小请求传输压力。前端需要将每页条数和当前页传给后端,后端根据条件查询出数据再传给前端,包括总条数、当前页、每页多少条数据等。

前端显示的当前页和每页多少条数据由后端传回的数据决定,否则出现改变前端参数,还未发请求时,页码的错乱。

当改变每页多少条时,当前页参数置为首页。

 

template包中建立pagination.py 

class Pagination:

    def __init__(self, page, all_count, per_num=3, max_show=11):
        try:
            page = int(page)
            if page <= 0:
                page = 1
        except Exception as e:
            page = 1
        self.page = page
        self.all_count = all_count
        self.per_num = per_num
        self.max_show = max_show
        # 总页码数
        self.page_num, more = divmod(all_count, per_num)
        if more:
            self.page_num += 1
        # 最多显示页码数
        half_show = max_show // 2

        if self.page_num < max_show:
            # 总页码数不够 最大显示页码数
            self.page_start = 1
            self.page_end = self.page_num
        else:
            # 能显示超过最大显示页码数
            if page <= half_show:
                # 处理左边的极值
                self.page_start = 1
                self.page_end = max_show
            elif page + half_show > self.page_num:
                # 处理右边的极值
                self.page_start = self.page_num - max_show + 1
                self.page_end = self.page_num
            else:
                # 正常的情况
                self.page_start = page - half_show
                self.page_end = page + half_show

    @property
    def start(self):
        return (self.page - 1) * self.per_num

    @property
    def end(self):
        return self.page * self.per_num

    @property
    def page_html(self):
        li_list = []
        if self.page == 1:
            li_list.append('<li class="disabled" ><a> << </a></li>')
        else:
            li_list.append('<li ><a href="?page={}"> << </a></li>'.format(self.page - 1))

        for i in range(self.page_start, self.page_end + 1):
            if self.page == i:
                li_list.append('<li class="active"><a href="?page={}">{}</a></li>'.format(i, i))
            else:
                li_list.append('<li><a href="?page={}">{}</a></li>'.format(i, i))

        if self.page == self.page_num:
            li_list.append('<li class="disabled" ><a> >> </a></li>')
        else:
            li_list.append('<li ><a href="?page={}"> >> </a></li>'.format(self.page + 1))

        return ''.join(li_list)
分页器

 

views文件中

from django.shortcuts import render

from CRM import models
from CRM.tools.pagination import Pagination


def customer_list(request):
    # 从数据库中拿取客户对象
    customer_obj = models.Customer.objects.all()
    # print(len(customer_obj))

    # 实例化分页器的类, 传入参数: 1: 当前页 2: 对象数量 3: 每页展示条数 4: 显示页面个数
    pager = Pagination(request.GET.get('page', '1'), len(customer_obj), per_num=2, max_show=3)
    print(pager.page_end)
    return render(request, 'customer_list.html', {
        "customer_obj": customer_obj[pager.start:pager.end],
        'page_html': pager.page_html,
        'last_page': pager.page_num}
                  )
分页器使用

 

HTML中 包含首页,尾页

<nav aria-label="Page navigation" style="text-align: center">
        <button style="
        border: none;
        border-radius:4px;
        padding:7px 12px;
        background-color: #f2f4f2;
        vertical-align: middle
        ">
            <a href="?page=1/">首页</a>
        </button>

        <ul class="pagination" style="vertical-align: middle">
            {{ page_html|safe }}
        </ul>

        <button style="
        border: none;
        border-radius:4px;
        padding:7px 12px;
        background-color: #f2f4f2;
        vertical-align: middle
        ">
            <a href="?page={{ last_page }}">尾页</a>
        </button>
    </nav>
模板中使用

 

 

 

 

 

 

转载于:https://www.cnblogs.com/niuli1987/p/9837930.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Django中,分页是一个常见的需求,为了方便处理分页,可以使用Django内置的分页Paginator。 Paginator的使用方法很简单,我们可以将一个QuerySet对象或者一个列表作为参数传入Paginator中,然后就可以使用Paginator提供的一些方法来进行分页操作。下面是一个简单的分页小插件的代码: ```python from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger def paginate(objects, page=1, per_page=10): """ 分页小插件 """ paginator = Paginator(objects, per_page) try: paginated_objects = paginator.page(page) except PageNotAnInteger: paginated_objects = paginator.page(1) except EmptyPage: paginated_objects = paginator.page(paginator.num_pages) return paginated_objects ``` 上面的代码定义了一个名为paginate的函数,它接受三个参数: - objects:需要进行分页的对象,可以是一个QuerySet对象或者一个列表。 - page:当前页码,默认为1。 - per_page:每页显示的条目数量,默认为10。 函数中首先使用Paginator来对objects进行分页操作,并使用try/except语句来处理异常情况。如果page参数不是一个整数,则将page设置为1;如果page参数超出了可用的页码范围,则将page设置为最大页码数(paginator.num_pages)。 最后,函数返回一个分页后的对象(paginated_objects),可以在Django模板中使用该对象来渲染分页。 使用该分页小插件的示例代码如下: ```python from django.shortcuts import render from .models import MyModel from .utils import paginate def my_view(request): my_objects = MyModel.objects.all() paginated_objects = paginate(my_objects, request.GET.get('page')) return render(request, 'my_template.html', {'paginated_objects': paginated_objects}) ``` 在上面的代码中,我们首先获取所有的MyModel对象,然后使用paginate函数将其分页,最后将分页后的对象传递给模板进行渲染。 在模板中,可以使用Django内置的分页标签({% for obj in paginated_objects %}、{% if paginated_objects.has_previous %}等)来渲染分页
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值