代码改变世界

124-django的翻页/分页功能,使用Paginator

2020-08-25 11:12  lzhshn  阅读(404)  评论(0编辑  收藏  举报

假设,通过一个入口可以显示全部的文章。

<header>
    <div>
        <h1>K-Note</h1>
        <ul>
            <li><a href="{% url 'notebook:start_page' %}">Start</a></li>
            <li><a href="{% url 'notebook:my_notes' 1 %}">My Notes</a></li>
            <li><a href="{% url 'notebook:add_note' %}">Add Note</a></li>
        </ul>
    </div>
</header>

  

由于默认显示通常都是第1页,所以在第二个链接里,显式地给出了一个值:1

看一下对应的views函数:

def my_notes(request, page_id):
    date_and_tag()
    all_notes = MyNote.objects.order_by('-pub_time')
    paginator_page = Paginator(all_notes, 10)
    page_obj = paginator_page.get_page(page_id)
    context = {'page_obj': page_obj, 'date_index': list(set(date_list)),
               'tag_index': list(set(tag_list))}
    return render(request, 'my_notes.html', context)

  

这个函数,接收url传来的page_id;

第一步:获取所有的文章,并且按照时间倒序;

第二步:实例化一个分页类:paginator_page,这个类是有两个参数:要进行分页操作的目标:all_notes,每一页有多少(10)个元素;

第三步:paginator_page对象,使用get_page方法和参数(url传来的第几页),获得一个具体的页面,然后将这个内容(page_obj)放入上下文。

 

最后看一下模板内容:

{% block content %}
<div class="left">
    <div>
    {% for note in page_obj %}
    <h3><a href="{% url 'notebook:one_note' note.pk %}">{{note.title}}</a></h3>
    <p>Create time:{{note.pub_time}} Update time:{{note.update_time}}</p>
    {% autoescape off %}
    <p>{{note.content|truncatechars:128}}</p>
    {% endautoescape %}
    <p>{{note.personal_tags.all}}</p>
    {% endfor %}
    </div>

    <div>
    <span>
    {% if page_obj.has_previous %}
        <a href="{% url 'notebook:my_notes' 1 %}">first</a>
        <a href="{% url 'notebook:my_notes' page_obj.previous_page_number %}">previous</a>
    {% endif %}

        <span>
            {{page_obj.number}} of {{page_obj.paginator.num_pages}}
        </span>

    {% if page_obj.has_next %}
        <a href="{% url 'notebook:my_notes' page_obj.next_page_number %}">next</a>
        <a href="{% url 'notebook:my_notes' page_obj.paginator.num_pages %}">last</a>
    {% endif %}
    </span>
    </div>

</div>
{% endblock content %}

  

显示文章的部分,和之前start_page的一样,重点看下面的内容:

最前页:1

上一页:page_obj.previous_page_number

当前页:page_obj.number

下一页:page_obj.next_page_number

最后页:page_obj.paginator.num_pages

 

每点击一次,将内容传递到url里,然后执行views函数,刷新页面内容,实现翻页。