一、导入
from django.core.paginator import Paginator, InvalidPage
二、使用
def list_article(request): username = request.session.get("username") if username: # articles = Article.objects.filter(author__username=username) categorys = Category.objects.filter(author__username=username) # 自定义文章列表 articles = [] # 生成1000篇文章 for i in range(1000): article = dict(id=i, title="Python从入门到放弃", category="Python", author="Will Smith", created_time="2019-12-21", latest_edit="2020-02-23") articles.append(article) # 获取请求页码 page_num = int(request.GET.get("p", 1)) # 用文章列表和每页显示的文章数初始化分页器,获取一个分页器对象 paginator = Paginator(articles, 10) # 分页器的四个主要属性:count(传入的对象数量)、num_pages(分的页数)、page_range(页码的范围)、per_page(每页显示的对象数量) print(paginator.count, paginator.per_page, paginator.num_pages) try: # 分页器的一个主要方法get_page(传入页码,获取对应的页对象) # 考虑几种情形:1、页码不为整数即无效页码 2、页码小于或超出实际页码范围 page_articles = paginator.page(number=page_num) except InvalidPage as e: page_articles = paginator.page(1) # 将页对象传递给模板进行渲染,页对象是一个可以迭代的对象,获取的是该页对象列表 # 页对象有几个主要的方法和属性: # object_list 当前页的内容,元素 # number 当前页的页码 # paginator 分页器对象 # has_next 有没有下一页 # next_page_number 下一页的页码 # has_previous 有没有上一页 # previous_page_number 上一页页码 # has_other_page 当前页有没有上一个或者下一页 # start_index 当前页第一个对象的索引 # end_index 当前页最后一个对象的索引 return render(request, "article/list-article.html", {"articles": page_articles, "categorys": categorys})
<div id="list-article"> <table class="table table-bordered table-striped table-hover table-condensed text-center"> <tr> <th class="text-center">文章ID</th> <th class="text-center">文章标题</th> <th class="text-center">所属分类</th> <th class="text-center">作者</th> <th class="text-center">创建时间</th> <th class="text-center">修改时间</th> <th class="text-center">操作</th> </tr> {% for article in articles %} <tr> <td>{{ article.id }}</td> <td>{{ article.title }}</td> <td>{{ article.category}}</td> <td>{{ article.author }}</td> <td>{{ article.created_time }}</td> <td>{{ article.latest_edit }}</td> <td><a href="{% url 'article:edit' article.id %}">编辑</a> <a href="{% url 'article:delete' article.id %}">删除</a></td> </tr> {% endfor %} </table> <nav> <ul class="pagination pagination pull-right"> {% if articles.has_previous %} <li><a href="{% url 'article:list' %}?p={{ articles.previous_page_number }}"><span>«</span></a></li> {% else %} <li class="disabled"><a href="{% url 'article:list' %}?p=1"><span>«</span></a></li> {% endif %} {% for page in articles.paginator.page_range %} {% if page > articles.number|add:-5 and page < articles.number|add:5 %} {% if page == articles.number %} <li class="active"><a href="{% url 'article:list' %}?p={{ page }}">{{ page }}</a></li> {% else %} <li><a href="{% url 'article:list' %}?p={{ page }}">{{ page }}</a></li> {% endif %} {% endif %} {% endfor %} {% if articles.has_next %} <li><a href="{% url 'article:list' %}?p={{ articles.next_page_number }}"><span>»</span></a></li> {% else %} <li class="disabled"><a href="{% url 'article:list' %}?p={{ articles.number }}"><span>»</span></a></li> {% endif %} </ul> </nav> </div>