day96-django-分页模块(自定义)

1.views.py
from app01 import pager
def custom(request): #当前页码: current_page = request.GET.get('page') # 数据库总行数 all_count = models.UserInfo2.objects.all().count() #实例化对象,参数:当前页码,数据库总行数,每页显示10行,url,每页显示11个页码 page_info = pager.Pager(current_page,all_count,10,'/custom.html',11) #每页显示的用户列表 user_list = models.UserInfo2.objects.all()[page_info.start():page_info.end()] #获取 上一页 页码 下一页 的字符串类型的所有li a标签 page_str = page_info.pager() return render(request, 'custom.html', {'user_list':user_list, 'page_str':page_str})
2.custom.html

<body>
    <h1>用户列表</h1>
    <ul>
        {% for row in user_list %}
            <li>{{ row.name }}</li>
        {% endfor %}
    </ul>

    <!--boorstrap分页-->
    <!--上 开始-->
    <nav aria-label="Page navigation">
      <ul class="pagination">
    <!--上 结束-->
          <!--|safe是告诉浏览器是安全的,否则浏览器会认为是xss攻击,无法显示正确样式-->
          {{ page_str|safe}}
    <!--下 开始-->
      </ul>
    </nav>
    <!--下 结束-->

</body>
3.urls.py

from app01 import views
urlpatterns = [
    url('custom.html', views.custom),
]
4.自定义的pager模块,里面有Pager类
class Pager(object):
    def __init__(self, current_page, all_count, per_page, base_url, show_page):
        """
        current_page:当前页码
        all_count: 数据库总行数
        per_page: 每页显示多少条数据,或者说多少行
        base_url:用户输入的url
        show_page:每页总共显示多少个页码
        """
        # 尝试执行,判断当前页码是不是字符串类型的数字,如果是,就强转为数字类型,
        # 然后增加属性
        try:
            self.current_page = int(current_page)
        # 如果不是,有可能是字符串,当前页码就直接跳转到第一页
        except Exception as e:
            self.current_page = 1

        self.per_page = per_page

        # divmod是取余,divmod(101,10)结果是10和1,10是页码数,10+1是总页码数
        a, b = divmod(all_count, per_page)
        # 如果b大于0,意味着不是整除,总页码数=页码数+1
        if b:
            a = a + 1
        # 总页码数属性
        self.all_pager = a
        # 每页总共显示多少个页码
        self.show_page = show_page

        self.base_url = base_url

    # 第几条开始
    def start(self):
        return (self.current_page - 1) * self.per_page

    # 第几条结束
    def end(self):
        return self.current_page * self.per_page

    # 假设per_page=10
    # 页码     每页显示开始和结束(不包结束的那条)
    # 1          0-10
    # 2          10-20
    # 3          20-30

    #获取 首页 上一页 页码 下一页 尾页的标签
    def pager(self):
        # v = "<a href='/custom.html?page=1'>1</a><a href='/custom.html?page=2'>2</a>"
        # return v

        # 页码列表
        page_list = []

        ######################## 页码判断 ############################
        # 每页显示的页码数11的一半,方便后面取到当前页码的前5页和后5页
        half = int((self.show_page - 1) / 2)

        # 如果总页码数 < 每页显示的页码数11
        if self.all_pager < self.show_page:
            begin = 1
            stop = self.all_pager + 1  # +1是因为range要头不要尾
        # 如果总页码数 >= 每页显示的页码数11
        else:
            # 如果当前页码 <=5,为了防止出现负数的页码,这里永远显示1,11
            if self.current_page <= half:
                begin = 1
                stop = self.show_page + 1
            # 如果当前页码 > 5:
            else:
                # 如果当前页码+5 > 总页码数,为了防止超过总页码数
                if self.current_page + half > self.all_pager:
                    begin = self.all_pager - self.show_page + 1
                    stop = self.all_pager + 1
                # 如果当前页码+5 <= 总页码数
                else:
                    begin = self.current_page - half
                    stop = self.current_page + half + 1

        ######################## 首页 ###############################
        first_page = "<li><a href='%s?page=1'>首页</a></li>" % (self.base_url)
        page_list.append(first_page)

        ######################## 上一页 ###############################
        # 如果当前页码<= 1,点上一页没跳转,因为href没设置url
        if self.current_page <= 1:
            prev = "<li><a href='#'>上一页</a></li>"
        # 如果当前页码> 1,href设置url和当前页码-1
        else:
            prev = "<li><a href='%s?page=%s'>上一页</a></li>" % (self.base_url, self.current_page - 1,)
        # 页码列表追加 上一页 的标签
        page_list.append(prev)

        ########################## 页码 #################################
        for i in range(begin, stop):
            #如果页码等于当前页码,这个标签就被选中,写上class='active',它是bootstrap分页的样式类
            if i == self.current_page:
                temp = "<li class='active'><a  href='%s?page=%s'>%s</a></li>" % (self.base_url, i, i,)
            else:
                temp = "<li><a href='%s?page=%s'>%s</a></li>" % (self.base_url, i, i,)
            page_list.append(temp)

        ######################### 下一页 ################################
        # 如果当前页码 >= 总页码数,点下一页没跳转
        if self.current_page >= self.all_pager:
            nex = "<li><a href='#'>下一页</a></li>"
        # 如果当前页码 < 总页码数,href设置url和当前页码+1
        else:
            nex = "<li><a href='%s?page=%s'>下一页</a></li>" % (self.base_url, self.current_page + 1,)
        # 页码列表追加 下一页 的标签
        page_list.append(nex)

        ######################## 尾页 ###############################
        end_page = "<li><a href='%s?page=%s'>尾页</a></li>" % (self.base_url,self.all_pager)
        page_list.append(end_page)

        ######################## 返回字符串类型的所有标签 ######################################
        # ''.join['a','b','c','d',....]结果是'a,b,c,d...'
        return ''.join(page_list)


 

原文地址:https://www.cnblogs.com/python-daxiong/p/12738254.html