django项目中通用的分页组件

分页组件

应用分页组件,需要以下两个步骤:

  1. 视图函数中:(先获取queryset,将request和queryset传入分页组件对象中,得到生成的html标签)

    def customer_list(request):
        # 所有数据
        queryset = models.Customer.objects.filter(active=1).select_related('level')
    
        pager = Pagination(request, queryset)
        context = {
            "queryset": queryset[pager.start:pager.end],
            "pager_string": obj.html()
        }
        return render(request, 'customer_list.html', context)
    
  2. 在页面上:(直接引用即可)

    {% for row in queryset %}
        {{row.id}}
    {% endfor %}
    
    <ul class="pagination">
        {{ pager_string }}
    </ul>
    

pager组件代码

import copy
from django.utils.safestring import mark_safe


class Pagination(object):
    """ 分页 """

    def __init__(self, request, query_set, per_page_count=10):
        """
        :param request: 需要用request对象中的GET中的数据进行校验和处理
        :param query_set: 查询数据库得到的查询集
        :param per_page_count: 每页显示几条数据
        """
        # 防止分页操作对后续的使用request.GET有影响
        self.query_dict = copy.deepcopy(request.GET)

        # 将self.query_dict._mutable设置为True:表示query_dict可修改,默认为False
        self.query_dict._mutable = True

        # 拿到总数据据数
        self.query_set = query_set
        total_count = query_set.count()
        self.total_count = total_count

        # 计算出总共有多少页面
        self.total_page, div = divmod(total_count, per_page_count)
        if div:
            self.total_page += 1

        # 对url中的请求参数进行校验处理,决定显示那一页
        page = request.GET.get('page')
        if not page:
            page = 1
        else:
            if not page.isdecimal():
                page = 1
            else:
                page = int(page)
                if page <= 0:
                    page = 1
                else:
                    if page > self.total_page:
                        page = self.total_page
        self.page = page

        # 每页数据条数
        self.per_page_count = per_page_count

        # 页面第一条数据
        self.start = (page - 1) * per_page_count
        # 页面最后一条数据
        self.end = page * per_page_count

    def html(self):
        """
        :return: 生成的当前页面的分页栏html
        """
        pager_list = []
        if not self.total_page:
            return ""

        # 求出生成的分页栏html显示的页面范围
        if self.total_page <= 11:
            # 总页码小于11
            start_page = 1
            end_page = self.total_page
        else:
            # 总页码比较多
            # 判断当前页 <=6: 1~11
            if self.page <= 6:
                start_page = 1
                end_page = 11
            else:
                if (self.page + 5) > self.total_page:
                    # 显示最后10页
                    start_page = self.total_page - 10
                    end_page = self.total_page
                else:
                    # 显示前后5页
                    start_page = self.page - 5
                    end_page = self.page + 5

        # 添加url中的参数,而不是替换:?&age=19&name=123&page=1
        # 首页
        self.query_dict.setlist('page', [1])
        pager_list.append('<li><a href="?{}">首页</a></li>'.format(self.query_dict.urlencode()))

        # 上一页
        if self.page > 1:
            self.query_dict.setlist('page', [self.page - 1])
            pager_list.append('<li><a href="?{}">上一页</a></li>'.format(self.query_dict.urlencode()))

        # 当前页+前后5页
        for i in range(start_page, end_page + 1):
            self.query_dict.setlist('page', [i])
            if i == self.page:
                item = '<li class="active"><a href="?{}">{}</a></li>'.format(self.query_dict.urlencode(), i)
            else:
                item = '<li><a href="?{}">{}</a></li>'.format(self.query_dict.urlencode(), i)
            pager_list.append(item)

        # 下一页
        if self.page < self.total_page:
            self.query_dict.setlist('page', [self.page + 1])
            pager_list.append('<li><a href="?{}">下一页</a></li>'.format(self.query_dict.urlencode()))

        # 尾页
        self.query_dict.setlist('page', [self.total_page])
        pager_list.append('<li><a href="?{}">尾页</a></li>'.format(self.query_dict.urlencode()))

        pager_list.append('<li class="disabled"><a>数据{}条{}页</a></li>'.format(self.total_count, self.total_page))
        pager_string = mark_safe("".join(pager_list))
        return pager_string


  def queryset(self):
      """
      :return: 生成的当前页面的展示数据
      """
      if self.total_count:
          return self.query_set[self.start:self.end]
      return self.query_set

可能用到django框架中QueryDict知识点,可以看看Django框架中的:QueryDict(处理url参数)

若有错误与不足请指出,关注DPT一起进步吧!!!

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要在Django模板使用React组件,需要进行以下步骤: 1. 安装React:首先需要在你的项目安装React。你可以使用npm或yarn来安装React。安装完成后,你需要在Django模板引入React的JavaScript文件。 2. 创建React组件:在你的项目创建React组件。你可以使用ES6语法来编写组件,然后使用Babel将ES6语法转换为浏览器可识别的JavaScript代码。 3. 将React组件渲染到Django模板:在Django模板,使用一个占位符来代表React组件。然后,使用JavaScript将React组件渲染到该占位符。 以下是一个简单的例子: 1. 安装React: ```bash npm install react react-dom ``` 2. 创建React组件: ```javascript // mycomponent.jsx import React from 'react'; class MyComponent extends React.Component { render() { return ( <div> <h1>Hello, World!</h1> </div> ); } } export default MyComponent; ``` 3. 将React组件渲染到Django模板: ```html <!-- mytemplate.html --> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>My Template</title> </head> <body> <div id="my-component"></div> <script src="/path/to/react.js"></script> <script src="/path/to/react-dom.js"></script> <script src="/path/to/babel.js"></script> <script type="text/babel"> import MyComponent from './mycomponent.jsx'; ReactDOM.render(<MyComponent />, document.getElementById('my-component')); </script> </body> </html> ``` 在上面的例子,我们将React组件渲染到了一个名为“my-component”的div元素。我们使用了Babel来将ES6语法转换为浏览器可识别的JavaScript代码。注意,我们在Django模板引入了React和Babel的JavaScript文件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

叫我DPT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值