Django分页

1,自定义简单的分页

views

from django.shortcuts import render,HttpResponse
import datetime
from django.utils.safestring import mark_safe



def page_list(request):
     curren_page=request.GET.get('p',1)
     curren_page=int(curren_page)
     row_num=10
     print(curren_page)
     start_p=(curren_page-1)*row_num
     end_p=curren_page*row_num
     list_temp=[]
     for i in range(0,100):
         list_temp.append(i)
     show_list=list_temp[start_p:end_p]
     count, remainder = divmod(len(list_temp), row_num)
     if remainder:
         count+=1
     str_list=[]
     for i in range(1,count+1):
         if i==curren_page:
            str_temp = '<a id=curren_page href="page_list?p=%s">%s</a>' % (i, i)
         else:
            str_temp='<a href="page_list?p=%s">%s</a>' % (i, i)
         str_list.append(str_temp)
     page_str="".join(str_list)
     page_str=mark_safe(page_str)
     #print(page_str)
     return render(request,'page_list.html',{'li':show_list,'page_str':page_str})

  

 

html

{%extends 'sample.html'%}
{% block title %}分页{% endblock %}
{% block css %}
    <style>
        #header{ height: 48px; background-color: #ff562f;}
        #page_num a{padding: 5px;margin: 4px;}
        #curren_page{ background-color: #ff93e5;}
    </style>
{% endblock %}
{% block page_content %}
    <ul>
       {% for item in li  %}
            {% include 'list.html'%}
       {% endfor %}
    </ul>
    <div id="page_num">{{ page_str}}</div>
{% endblock %}

  

 

 

Django框架 之 Pagination分页实现

一、自定义分页

1、基础版自定义分页

data = []
 
for i in range(1, 302):
    tmp = {"id": i, "name": "alex-{}".format(i)}
    data.append(tmp)
 
print(data)
 
 
def user_list(request):
 
    # user_list = data[0:10]
    # user_list = data[10:20]
    try:
        current_page = int(request.GET.get("page"))
    except Exception as e:
        current_page = 1
 
    per_page = 10
 
    # 数据总条数
    total_count = len(data)
    # 总页码
    total_page, more = divmod(total_count, per_page)
    if more:
        total_page += 1
 
    # 页面最多显示多少个页码
    max_show = 11
    half_show = int((max_show-1)/2)
 
    if current_page <= half_show:
        show_start = 1
        show_end = max_show
    else:
        if current_page + half_show >= total_page:
            show_start = total_page - max_show
            show_end = total_page
        else:
            show_start = current_page - half_show
            show_end = current_page + half_show
 
    # 数据库中获取数据
    data_start = (current_page - 1) * per_page
    data_end = current_page * per_page
 
    user_list = data[data_start:data_end]
 
    # 生成页面上显示的页码
    page_html_list = []
    # 加首页
    first_li = '<li><a href="/user_list/?page=1">首页</a></li>'
    page_html_list.append(first_li)
    # 加上一页
    if current_page == 1:
        prev_li = '<li><a href="#">上一页</a></li>'
    else:
        prev_li = '<li><a href="/user_list/?page={}">上一页</a></li>'.format(current_page - 1)
    page_html_list.append(prev_li)
    for i in range(show_start, show_end+1):
        if i == current_page:
            li_tag = '<li class="active"><a href="/user_list/?page={0}">{0}</a></li>'.format(i)
        else:
            li_tag = '<li><a href="/user_list/?page={0}">{0}</a></li>'.format(i)
        page_html_list.append(li_tag)
 
    # 加下一页
    if current_page == total_page:
        next_li = '<li><a href="#">下一页</a></li>'
    else:
        next_li = '<li><a href="/user_list/?page={}">下一页</a></li>'.format(current_page+1)
    page_html_list.append(next_li)
 
    # 加尾页
    page_end_li = '<li><a href="/user_list/?page={}">尾页</a></li>'.format(total_page)
    page_html_list.append(page_end_li)
 
    page_html = "".join(page_html_list)
 
    return render(request, "user_list.html", {"user_list": user_list, "page_html": page_html})

  

2、封装保存版

class Pagination(object):
    def __init__(self, current_page, total_count, base_url, per_page=10, max_show=11):
        """
        :param current_page: 当前页
        :param total_count: 数据库中数据总数
        :param per_page: 每页显示多少条数据
        :param max_show: 最多显示多少页
        """
        try:
            current_page = int(current_page)
        except Exception as e:
            current_page = 1
 
        self.current_page = current_page
        self.total_count = total_count
        self.base_url = base_url
        self.per_page = per_page
        self.max_show = max_show
 
        # 总页码
        total_page, more = divmod(total_count, per_page)
        if more:
            total_page += 1
         
        half_show = int((max_show - 1) / 2)
        self.half_show = half_show
        self.total_page = total_page
 
    @property
    def start(self):
        return (self.current_page - 1) * self.per_page
 
    @property
    def end(self):
        return self.current_page * self.per_page
 
    def page_html(self):
 
        if self.current_page <= self.half_show:
            show_start = 1
            show_end = self.max_show
        else:
            if self.current_page + self.half_show >= self.total_page:
                show_start = self.total_page - self.max_show
                show_end = self.total_page
            else:
                show_start = self.current_page - self.half_show
                show_end = self.current_page + self.half_show
 
                # 生成页面上显示的页码
        page_html_list = []
        # 加首页
        first_li = '<li><a href="{}?page=1">首页</a></li>'.format(self.base_url)
        page_html_list.append(first_li)
        # 加上一页
        if self.current_page == 1:
            prev_li = '<li><a href="#">上一页</a></li>'
        else:
            prev_li = '<li><a href="{0}?page={1}">上一页</a></li>'.format(self.base_url, self.current_page - 1)
        page_html_list.append(prev_li)
        for i in range(show_start, show_end + 1):
            if i == self.current_page:
                li_tag = '<li class="active"><a href="{0}?page={1}">{1}</a></li>'.format(self.base_url, i)
            else:
                li_tag = '<li><a href="{0}?page={1}">{1}</a></li>'.format(self.base_url, i)
            page_html_list.append(li_tag)
 
        # 加下一页
        if self.current_page == self.total_page:
            next_li = '<li><a href="#">下一页</a></li>'
        else:
            next_li = '<li><a href="{0}?page={1}">下一页</a></li>'.format(self.base_url, self.current_page + 1)
        page_html_list.append(next_li)
 
        # 加尾页
        page_end_li = '<li><a href="{0}?page={1}">尾页</a></li>'.format(self.base_url, self.total_page)
        page_html_list.append(page_end_li)
 
        return "".join(page_html_list)

  

3、封装保存版使用指南

1 def user_list(request):
2     pager = Pagination(request.GET.get("page"), len(data), request.path_info)
3     user_list = data[pager.start:pager.end]
4     page_html = pager.page_html()
5     return render(request, "user_list.html", {"user_list": user_list, "page_html": page_html})

 

 

二、Django内置分页

1、内置分页view部分

from django.shortcuts import render
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
 
L = []
for i in range(999):
    L.append(i)
 
def index(request):
    current_page = request.GET.get('page')
 
    paginator = Paginator(L, 10)
    # per_page: 每页显示条目数量
    # count:    数据总个数
    # num_pages:总页数
    # page_range:总页数的索引范围,如: (1,10),(1,200)
    # page:     page对象
    try:
        page_obj = paginator.page(current_page)
        # has_next              是否有下一页
        # next_page_number      下一页页码
        # has_previous          是否有上一页
        # previous_page_number  上一页页码
        # object_list           分页之后的数据列表
        # number                当前页
        # paginator             paginator对象
    except PageNotAnInteger:
        page_obj = paginator.page(1)
    except EmptyPage:
        page_obj = paginator.page(paginator.num_pages)
    return render(request, 'index.html', {'page_obj ':page_obj})

  

2、内置分页HTML部分

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
<ul>
    {% for item in page_obj %}
        <li>{{ item }}</li>
    {% endfor %}
</ul>
 
<div class="pagination">
    <span class="step-links">
        {% if page_obj.has_previous %}
            <a href="?page=1">« first</a>
            <a href="?page={{ page_obj.previous_page_number }}">previous</a>
        {% endif %}

        <span class="current">
            Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}.
        </span>

        {% if page_obj.has_next %}
            <a href="?page={{ page_obj.next_page_number }}">next</a>
            <a href="?page={{ page_obj.paginator.num_pages }}">last »</a>
        {% endif %}
    </span>
</div>
</body>
</html>

  

 https://docs.djangoproject.com/zh-hans/3.2/topics/pagination/

 

 
posted @ 2020-05-22 18:04  JIMfan  阅读(78)  评论(0)    收藏  举报