Django学习教程(十七)Django分页功能实现

Django学习教程(十七)Django分页功能实现

前言

  上一篇我们实现了文章详情页中的上一篇和下一篇跳转。这一篇我们继续完善博客列表页,实现分页功能。

  如果博客文章比较多,全部显示在一个页面中就不太合适,所以需要分页展示。

1.导入分页类

Django中提供了Paginator类,可以用来实现分页。

代码:

复制代码
from django.core.paginator import Paginator

2.修改文章列表视图

打开views.py文件,修改article_list方法。

代码:

复制代码
from django.shortcuts import render
from django.core.paginator import Paginator
from .models import Article


def article_list(request):
    articles = Article.objects.all().order_by('-created_time')

    paginator = Paginator(articles, 5)

    page_number = request.GET.get('page')
    page_obj = paginator.get_page(page_number)

    return render(request, 'blog/article_list.html', {'page_obj': page_obj})

这里的Paginator(articles, 5)表示每页显示5条数据。

request.GET.get('page')表示获取地址栏中的page参数。

3.修改列表模板

article_list.html中遍历page_obj。

代码:

复制代码
{% for article in page_obj %}
    <div class="card mb-3">
        <div class="card-body">
            <h5 class="card-title">{{ article.title }}</h5>
            <p class="card-text">{{ article.content }}</p>
            <a href="/article/{{ article.id }}/" class="btn btn-primary">查看详情</a>
        </div>
    </div>
{% endfor %}

4.添加分页按钮

在文章列表下面添加分页。

代码:

复制代码
<nav>
    <ul class="pagination">
        {% if page_obj.has_previous %}
            <li class="page-item">
                <a class="page-link" href="?page={{ page_obj.previous_page_number }}">上一页</a>
            </li>
        {% endif %}

        <li class="page-item active">
            <span class="page-link">
                {{ page_obj.number }}
            </span>
        </li>

        {% if page_obj.has_next %}
            <li class="page-item">
                <a class="page-link" href="?page={{ page_obj.next_page_number }}">下一页</a>
            </li>
        {% endif %}
    </ul>
</nav>

5.访问测试

访问首页:

复制代码
http://127.0.0.1:8000/

访问第二页:

复制代码
http://127.0.0.1:8000/?page=2

如果文章数量超过每页显示数量,就可以看到分页效果。

6.常用分页属性

常用分页属性有:

  1. page_obj.has_previous 是否有上一页
  2. page_obj.previous_page_number 上一页页码
  3. page_obj.has_next 是否有下一页
  4. page_obj.next_page_number 下一页页码
  5. page_obj.number 当前页码

7.总结

  这一篇我们学习了Django中的分页功能,主要使用了Paginator类。

  分页功能在博客、电商、后台管理系统中都非常常见,大家可以多敲几遍代码,加深理解。好了这一篇就到这里,下一篇我们继续学习实现最近文章列表,如果对你有帮助,点赞加关注,下篇见。