124-django的翻页/分页功能,使用Paginator
2020-08-25 11:12 lzhshn 阅读(416) 评论(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函数,刷新页面内容,实现翻页。