在Django中分页应用案例

linxiaoyun 2017.4.28 1:04 995 0
Django技术 Django Paginator

Django自身已经集成了一个分页器,不要我们重新造轮子,直接使用就行。

在MVC设计模式中,views.py作为controller,templates作为view。应用Django分页Paginator需要在这两处地方修改。

view中:取得queryset后,增加分页器过滤,然后将数据传递给模板。

def index(request):

    post_list = Post.objects.all()

    data = {}
    pages, post_list = getPages(request,post_list)

    data['post_list'] = post_list
    data['pages'] = pages

    return render(request, 'blog/index.html', data )

其中getPages为分页器过滤,独立作为一个文件paginator.py,在view中引用。

from django.core.paginator import Paginator,EmptyPage, PageNotAnInteger

def getPages(request, objectlist):
    """get the paginator"""
    currentPage = request.GET.get('page', 1)
    paginator = Paginator(objectlist, 10)

    try:
        objectlist = paginator.page(currentPage)
    except PageNotAnInteger:
    # If page is not an integer, deliver first page.
        objectlist = paginator.page(1)
    except EmptyPage:
    # If page is out of range (e.g. 9999), deliver last page of results.
        objectlist = paginator.page(paginator.num_pages)


    objectlist = paginator.page(currentPage)

    return paginator, objectlist

如此,得到分页器过滤后的数据后,在模板中通过模板标签使用。

在index.html模板文件中,增加block,方便当页数小于2时,控制显示。

{% block paginations %}
   {% if pages.num_pages > 1 %}
   <div>
    <span class="blog_footer_tip">
        共{{ pages.count }}篇博文。当前第{{ post_list.number }}页,共{{ pages.num_pages }}页
    </span>

    <ul class="pagination">
        {# 上一页,这里需要用到has_previous方法判断是否有上一页 #}
        <li>
         {% if post_list.has_previous %}
                <a href="?page={{ post_list.previous_page_number }}" aria-label="Previous">
                {% else %}
            <a href="?page={{ post_list.number }} " aria-label="Previous">
                {% endif %}

                <span aria-hidden="true">&laquo;</span>
            </a>
        </li>

        {# 遍历所有页码 #}
        {% for page in pages.page_range %}
            <li><a href="?page={{ page }}">{{ page }}</a></li>
        {% endfor %}

        {# 下一页,这里需要用到has_next方法判断是否有下一页 #}
        <li>
         {% if post_list.has_next %}
            <a href="?page={{ post_list.next_page_number }}" aria-label="Next">
                {% else %}
          <a href="?page={{ post_list.number}}" aria-label="Next">
                {% endif %}

                <span aria-hidden="true">&raquo;</span>
            </a>
        </li>
    </ul>
</div>




{% block extra_footer %}
    {#设置凸显当前的页码#}
    <script type="text/javascript">
        $(".pagination li:eq({{ post_list.number}})").addClass("active");
    </script>
{% endblock %}

{% endif %}
{% endblock paginations %}

说明几点:1.对象pages有num_pages,count,page_range等属性方法,经过分页器过滤的post_list有number,previous_page_number,next_page_number等。2.通过if模板标签,将block extra_footer在不需要的时候隐藏了。

Last Modified·2017年5月3日 21:05

暂无评论

您尚未登录,请先才能评论。