详解Django的 paginate_orphans() 函数:指定一页最少显示的对象数量

  • Post category:Python

paginate_orphans()函数是Django分页功能中的一个参数,其作用是指定分页时允许放置在最后一个页面的单独页面数。

在Django中使用分页可能会出现最后一页仅有1~2个数据的情况,而这会对用户产生不良体验。因此,paginate_orphans()函数就能够在尽量将数据合理分配到各页的前提下,规定最后一页的数据数量不低于指定值,以增加用户体验。

paginate_orphans()函数的使用方法非常简单。只需在分页模板中作为模板标签传入一个整数值作为参数即可。例如:

{% if page_obj.has_other_pages %}
  <ul class="pagination">
    {% if page_obj.previous_page_number %}
      <li><a href="?page=1">&laquo;</a></li>
      <li><a href="?page={{ page_obj.previous_page_number }}"><</a></li>
    {% endif %}
    {% for num in page_obj.paginator.page_range %}
      {% if page_obj.number == num %}
        <li class="active"><a href="#">{{ num }}</a></li>
      {% elif num > page_obj.number|add:'-3' and num < 
          page_obj.number|add:'3' %}
        <li><a href="?page={{ num }}">{{ num }}</a></li>
      {% endif %}
    {% endfor %}
    {% if page_obj.next_page_number %}
      <li><a href="?page={{ page_obj.next_page_number }}">></a></li>
      <li><a href="?page={{ page_obj.paginator.num_pages }}">&raquo;</a></li>
    {% endif %}
  </ul>
{% endif %}

{% if is_paginated %}
  <div class="pagination">
    <span class="total-pages">Page {{ page_obj.number }} of {{ 
    paginator.num_pages }}.</span>
    {% if page_obj.has_previous %}
      <a class="button" href="?page={{ page_obj.previous_page_number }}
      {% if request.GET.q %}&q={{ request.GET.q }}{% endif %}">Previous</a>
    {% endif %}
    {% if page_obj.has_next %}
      <a class="button" href="?page={{ page_obj.next_page_number }}
      {% if request.GET.q %}&q={{ request.GET.q }}{% endif %}">Next</a>
    {% endif %}
  </div>
{% endif %}

以上是一段使用Django分页模板的样例,其中的paginate_orphans()函数可以在传参时限定最后一页的物品数。

下面来举两个具体的例子,说明使用paginate_orphans()函数的效果:

假设你有一篇博客,下方需要展示50篇相关文章,且每页展示10篇文章。未使用paginate_orphans()函数时,最后一页仅展示了5篇文章,最后一页单独存在,影响了浏览体验。如果设置paginate_orphans(2),即每页至少展示12篇文章时,最后一页面就会展示有6篇文章,而不是只有5篇。这样,数据样式将服务于更好的用户体验。

再例如,你有一个电商网站,产品页需要100个商品进行展示。同样设定每页展示10件商品,如果未设置paginate_orphans()函数,最后一页仅展示了10件商品。而如果设置paginate_orphans(2),则最后一页将至少有12件商品逐一展示。不论最后一页数据量多少,使用了paginate_orphans()都可以使得用户浏览数据时视觉效果更加合理。