高阶应用-分页

2022-09-14 17:30:27 浏览数 (1)

一、Paginator对象

  • 创建对象 格式:Paginator(列表, 整数) 返回值:返回的分页对象
  • 属性 count:对象总数 num_pages:页面总数 page_range: [1,2,3,4,5] 页码从1开始
  • 方法 page(num) :获得一个Page对象,如果提供的页码不存在会抛出"InvalidPage"异常
  • 异常
    • InvalidPage:当向page()传递的是一个无效的页码时抛出
    • PageNotAnInteger:当向page()传递的不是一个整数时抛出
    • EmptyPage:当向page()传递一个有效值,但是该页面时没有数据时抛出

二、Page对象

  • 创建对象 Paginator对象的page()方法返回得到Page对象(不需要手动创建)
  • 属性
    • object_list:当前页上所有的数据(对象)列表
    • number:当前页的页码值
    • paginator:当前page对象关联的paginator对象
  • 方法
    • has_next: 判断是否有下一页,如果有返回True
    • has_previous:判断是否有上一页,如果有返回True
    • has_other_pages:判断是否有上一页或下一页,如果有返回True
    • next_page_number:返回下s一页的页码,如果下一页不存在抛出InvalidPage异常
    • previous_page_number:返回上一页的页码,如果上一页不存在抛出InvalidPage异常
    • len():返回当前页的数据(对象)个数

三、示例

路由配置

代码语言:javascript复制
path(<span class="hljs-string">r'^stupage/&lt;int:nowPage&gt;/$'</span>,views.stuPage,name=<span class="hljs-string">'page'</span>),

视图

代码语言:javascript复制
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">stuPage</span><span class="hljs-params">(req,nowPage)</span>:</span>
    allStu = Students.stuObj.all()
    pag = Paginator(allStu,<span class="hljs-number">6</span>)
    <span class="hljs-keyword">if</span> int(nowPage)&gt;=int(pag.num_pages):
         nowPage = pag.num_pages
    <span class="hljs-keyword">try</span>:
        page = pag.page(nowPage)
    <span class="hljs-keyword">except</span>:
        page = pag.page(pag.num_pages)
    <span class="hljs-comment"># print(page)</span>
    <span class="hljs-keyword">return</span> render(request,<span class="hljs-string">'studentPage.html'</span>,{<span class="hljs-string">'students'</span>:page})

模板

代码语言:javascript复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
展示分页的数据
{% for i in data.object_list %}
	<p>{{ i.username }}</p>
{% endfor %}
  
展示分页的页码
<nav aria-label="Page navigation">
  <ul class="pagination">
  <li>
      <a href="{% url 'App:showPage' %}?page=1" aria-label="Next">
        <span aria-hidden="true">首页</span>
      </a>
    </li>
    <li {% if not data.has_previous %}class="disabled"{% endif %}>
      <a {% if data.has_previous %}
      href="{% url 'App:showPage' %}?page={{ data.previous_page_number }}"
      {% endif %} aria-label="Previous">
        <span aria-hidden="true">&laquo;</span>
      </a>
    </li>
      {% for index in data.paginator.page_range %}
            <li  {% if index == data.number %}class="active"{% endif %}><a href="{% url 'App:showPage' %}?page={{ index }}">{{ index }}</a></li>
      {% endfor %}
    <li {% if not data.has_next %}class="disabled"{% endif %}>
      <a {% if data.has_next %}
      href="{% url 'App:showPage' %}?page={{ data.next_page_number }}"
      {% endif %} aria-label="Next">
        <span aria-hidden="true">&raquo;</span>
      </a>
    </li>
    <li {% if not data.paginator.num_pages %}class="disabled"{% endif %}>
      <a {% if data.paginator.num_pages %}
      href="{% url 'App:showPage' %}?page={{ data.paginator.num_pages }}"
      {% endif %} aria-label="Next">
        <span aria-hidden="true">尾页</span>
      </a>
    </li>
  </ul>
</nav>
<script src="https://cdn.bootcss.com/jquery/1.12.4/jquery.min.js"></script>
    <!-- 加载 Bootstrap 的所有 JavaScript 插件。你也可以根据需要只加载单个插件。 -->
<script src="https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
</body>
</html>

0 人点赞