九、七天入门Django开发 Django 实现博客的分页功能

前言

当博客上发布的文章越来越多时,通常需要进行分页显示。

步骤:



Bootstarp 实现分页按钮

去Bootstarp 官网找到分页组件,把代码复制过来,微调即可

分页的html代码
D:\project\blogs\myblogs\templates\blog\index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Django Web框架</title>
    <!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css"
          integrity="sha384-HSMxcRTRxnN+Bdg0JdbxYKrThecOKuH5zCYotlSAcp1+c8xmyTe9GYg1l9a69psu" crossorigin="anonymous">
    <!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
    <script src="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"
            integrity="sha384-aJ21OjlMXNL5UyIl/XNwTMqvzeRMZH2w8c5cRVpzpU8Y5bApTppSuUkhZXN0VxHd"
            crossorigin="anonymous"></script>

</head>
<body>
<div class="container page-header">
    <h1>入门Django Web框架
        <small>--- by wwh</small>

    </h1>

</div>
>
<div class="container page-body">
    <div class="col-md-9" role="main">
        <div class="body-main">
            {% for article in article_list %}

                <div>
                    <h2><a href="/blog/detail/{{ article.article_id }}">{{ article.title }}</a></h2>
                    <p>
                        {{ article.brief_content }}
                    </p>
                </div>
            {% endfor %}
        </div>
        <div>

            <nav aria-label="Page navigation">
                <ul class="pagination">
                    <li>
                        <a href="/blog/index?page={{ previous_page }}" aria-label="Previous">
                            <span aria-hidden="true">&laquo;</span>
                        </a>
                    </li>
                    {% for num in page_num %}
                    <li><a href="/blog/index?page={{ num }}">{{ num }}</a></li>
                    {% endfor %}
                    <li>
                        <a href="/blog/index?page={{ next_page }}" aria-label="Next">
                            <span aria-hidden="true">&raquo;</span>
                        </a>
                    </li>
                </ul>
            </nav>

        </div>

    </div>
    <div class="col-md-3" role="complementary">
        <div>
            <h2>最新文章</h2>
            {% for article in article_list %}
                <h4><a href="/blog/detail/{{ article.article_id }}">{{ article.title }}</a></h4>
            {% endfor %}
        </div>
    </div>
</div>
</body>
</html>



通过 Django Pagination 实现分页

首先直接看Django官网的例子

官网例子连接:
https://docs.djangoproject.com/en/2.2/topics/pagination/


Paginator 类的常用方法

分页功能由 Django 内置的 Paginator 类提供,这个类位于 django.core.paginator 模块,需要使用它时,只需在适当的地方导入这个类即可:

首先进入python shell 模式

# 对 item_list 进行分页,每页包含 2 个数据。
item_list = ['john', 'paul', 'george', 'ringo']
p = Paginator(item_list, 2)

# 取特定页的数据:
# 例如 取第 2 页的数据
page2 = p.page(2)
page2.object_list
['george', 'ringo']

# 查询特定页的当前页码数:
page2.number
2

# 查看分页后的总页数:
p.num_pages
2

# 查看某一页是否还有上一页,以及查询该页上一页的页码:
# 例如 查询第二页是否还有上一页
page2.has_previous()
True

# 查询第二页上一页的页码
page2.previous_page_number()
1

# 查看某一页是否还有下一页,以及查询该页下一页的页码:
# 例如 查询第二页是否还有下一页
page2.has_next()
False



使用Django分页组件实现分页功能

在上一篇的基础上,修改 get_index_page 函数即可

views.py

def get_index_page(request):
    page = request.GET.get('page')            # 获取 page 参数
    if page:
        page = int(page)
    else:
        page = 1
    all_article = Article.objects.all()       # 获取所有文章

    paginator = Paginator(all_article, 3)     # 一页3篇文章
    page_num = paginator.num_pages            # 分页的数量
    print('page num:', page_num)
    page_article_list = paginator.page(page)  # 获取某一个的文章列表
    if page_article_list.has_next():          # 如果有下一页
        next_page = page + 1                  # 页数加一
    else:
        next_page = page                      # 否则下一页就等于当前页

    if page_article_list.has_previous():      # 如果有上一页
        previous_page = page - 1              # 页数减一
    else:
        previous_page = page                  # 否则上一页就等于当前页

    return render(request, 'blog/index.html',
                  {
                      'article_list': page_article_list,
                      'page_num': range(1, page_num + 1),
                      'curr_page': page,                  # 当前页面
                      'next_page': next_page,             # 上一页
                      'previous_page': previous_page,     # 下一页
                  }
                  )


以上就实现了分页功能

原文地址:https://www.cnblogs.com/wwho/p/15695786.html