Django分页操作-内置和自定义分页使用

内置分页

效果展示:

views.py

from django.core.paginator import Paginator
def fenye(request):


    current_page = request.GET.get('page')

    user_list=models.UserInfo.objects.all()

    paginator=Paginator(user_list,10)
    try:
        posts=paginator.get_page(current_page)
    except Exception as e:
        posts = paginator.get_page(1)


    return render(request, 'fenye.html', {'posts': posts})

fenye.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Django内置分页</title>
</head>
<body>
    <ul>
    {% for user in posts.object_list %}
        <li>{{ user.user }}</li>
    {% endfor %}
    </ul>

    <div>
        <a href="fenye.html?page=1">INDEX</a>
        {% if posts.has_previous %}
            <a href="fenye.html?page={{ posts.previous_page_number }}">PREV</a>
        {% endif %}
        {% for num in posts.paginator.page_range %}
            <a href="fenye.html?page={{ num }}"> {{ num }}</a>
        {% endfor %}
        {% if posts.has_next %}
            <a href="fenye.html?page={{ posts.next_page_number }}">NEXT</a>
        {% endif %}
        <a href="fenye.html?page={{ posts.paginator.num_pages }}">END</a>

    </div>
</body>
</html>

自定义分页

最终效果:

page.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>自定义分页</title>
</head>
<body>
    <ul>
    {% for user in userinfo_list %}
        <li>{{ user.user }}</li>
    {% endfor %}
    {{ page_info.pager|safe }}
    </ul>
</body>
</html>

urls.py

from django.urls import path
from app import views

urlpatterns = [
    path('index/', views.index),
    path('page.html', views.page),
]

views.py

class PageInfo(object):

    def __init__(self, current_page, total, per_page,url,show_page=11):
        """
        :param current_page:展示页
        :param total:总条数
        :param per_page:每页显示数
        :param url:执行的地址
        :param show_page:页码显示数
        """
        try:
            self.current_page = int(current_page)
        except Exception as e:
            self.current_page = 1

        self.total = total
        self.per_page = per_page
        self.url = url
        self.show_page=show_page

        a, b = divmod(total, per_page)
        if b:
            a += 1
        self.all_page = a

    def start_page(self):
        return (self.current_page - 1) * self.per_page

    def end_page(self):
        return self.current_page * self.per_page

    def pager(self):
        page_list = []

        half=int((self.show_page-1)/2)

        # start_page=1
        # end_page=self.all_page+1

        if self.all_page<self.show_page:
            start_page=1
            end_page=self.all_page+1
        else:
            if self.current_page<=half:
                start_page=1
                end_page=self.show_page+1
            else:
                if self.current_page+half>self.all_page:
                    start_page=self.all_page-self.show_page+1
                    end_page=self.all_page+1
                else:
                    start_page=self.current_page-half
                    end_page=self.current_page+half+1

        home="<a style='display:inline-block;padding:5px;margin:5px;' href='%s?page=1'>首页</a>"%(self.url)
        page_list.append(home)

        if self.current_page<=1:
            prev="<a style='display:inline-block;padding:5px;margin:5px;' href='#'>上一页</a>"
        else:
            prev = "<a style='display:inline-block;padding:5px;margin:5px;' href='%s?page=%s'>上一页</a>" % (self.url,self.current_page - 1)
        page_list.append(prev)

        for i in range(start_page, end_page):
            if i == self.current_page:
                temp = "<a style='display:inline-block;padding:5px;margin:5px;background-color:blue;' href='%s?page=%s'>%s</a>" % (self.url,i,i)
            else:
                temp = "<a style='display:inline-block;padding:5px;margin:5px;' href='%s?page=%s'>%s</a>" % (self.url,i,i)
            page_list.append(temp)

        if self.current_page>=self.all_page:
            nex="<a style='display:inline-block;padding:5px;margin:5px;' href='#'>下一页</a>"
        else:
            nex = "<a style='display:inline-block;padding:5px;margin:5px;' href='%s?page=%s'>下一页</a>" % (self.url,self.current_page +1)
        page_list.append(nex)

        lst = "<a style='display:inline-block;padding:5px;margin:5px;' href='%s?page=%s'>末页</a>"%(self.url,self.all_page)
        page_list.append(lst)

        return ''.join(page_list)

def page(request):
    # 获取用户访问页
    current_page = request.GET.get('page')

    # 总条数
    total = models.UserInfo.objects.all().count()

    page_info = PageInfo(current_page, total,10,'page.html',8)

    userinfo_list = models.UserInfo.objects.all()[page_info.start_page(): page_info.end_page()]

    return render(request, 'page.html', {'userinfo_list': userinfo_list, 'page_info': page_info})
发布了26 篇原创文章 · 获赞 0 · 访问量 588

猜你喜欢

转载自blog.csdn.net/kkLeung/article/details/104701681