|
| 1 | +--- |
| 2 | +author: shellbye |
| 3 | +comments: true |
| 4 | +data: 2015-11-19 11:16 |
| 5 | +layout: post |
| 6 | +slug: django-pagination |
| 7 | +title: Django Pagination |
| 8 | +categories: |
| 9 | +- tech_world |
| 10 | +tags: |
| 11 | +- Django |
| 12 | +--- |
| 13 | + |
| 14 | +做过web开发的人一定对分页有一定的印象,就我个人而言, |
| 15 | +一直是害怕分页的,因为我第一次接触分页时,那个记忆是比较痛苦的, |
| 16 | +当时是师兄坐在我背后,他指挥着我写分页,而我那时又啥也不懂, |
| 17 | +虽然最后通过这种方式懂了,但是这个过程还是让我心有余悸. |
| 18 | +所以这也是我写技术博客的一个原因,很多技术很牛的人其实是不善于教别人的, |
| 19 | +只有像我这种刚刚学会的人,才知道怎么去教别人. |
| 20 | + |
| 21 | +先说说为什么要分页,在刚开始学web开发时,很多人意识不到分页的重要性, |
| 22 | +比如当初的我.觉得能把数据库里的东西拿出来,展示到网页上是一件非常牛逼的事, |
| 23 | +其他的似乎都不重要了.但是很快的,你要遇到你人生当初的第一次"用户体验", |
| 24 | +所有数据一次加载出来是比较省事,但是体验不好.试想你去看书,书只有一页, |
| 25 | +很长很长的一页,如果你一次看不完,那么第二次你就很难从上次终止的地方开始了. |
| 26 | +所以分页就出现了. |
| 27 | + |
| 28 | +web中也是一样的道理,用户需要一部分一部分的看,这样比较方便查找, |
| 29 | +而且从服务器的角度看,一点一点的返回数据,比一次性返回全部数据也压力更小, |
| 30 | +而且也更节约带宽. |
| 31 | + |
| 32 | +说这么多废话是因为Django把分页已经写到非常简单的地步了,简单到我如果不说点废话, |
| 33 | +那么这篇博客就真没啥东西了.[上一篇]{:target="_blank"}写了Django的ListView, |
| 34 | +那么这篇就基于上篇写分页. |
| 35 | + |
| 36 | +首先是`views.py`: |
| 37 | + |
| 38 | +{% highlight python %} |
| 39 | +class NewsList(ListView): |
| 40 | + model = News |
| 41 | + paginate_by = 2 |
| 42 | + |
| 43 | +{% endhighlight %} |
| 44 | + |
| 45 | +相比与没有分页的情况,只是多了一个新的属性`paginate_by`, |
| 46 | +该属性用于指定每页所包含的对象个数.加了这一行代码之后,分页的`views.py`部分就搞定了. |
| 47 | +接下来是`templates`里面的页面了: |
| 48 | + |
| 49 | +{% highlight python %} |
| 50 | +{% raw %} |
| 51 | + {% if is_paginated %} |
| 52 | + {% if page_obj.has_previous %} |
| 53 | + <a href="?page={{ page_obj.previous_page_number }}">previous</a> |
| 54 | + {% endif %} |
| 55 | + |
| 56 | + <span class="current"> |
| 57 | + Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}. |
| 58 | + </span> |
| 59 | + |
| 60 | + {% if page_obj.has_next %} |
| 61 | + <a href="?page={{ page_obj.next_page_number }}">next</a> |
| 62 | + {% endif %} |
| 63 | + {% endif %} |
| 64 | +{% endraw %} |
| 65 | +{% endhighlight %} |
| 66 | + |
| 67 | +这是需要添加的分页控件的代码,其中最主要的一个变量就是`page_obj`, |
| 68 | +它用来控制分页控件的前页和后页,以及是否又前一页后一页等.其中, |
| 69 | +页数的名字"page"是可以自己在`views.py`里通过`page_kwarg`这个变量来自定义的. |
| 70 | +分页的顺序也是可以通过`ordering`来自己定义的,指定排序依据的field就可以. |
| 71 | + |
| 72 | +[上一篇]:/blog/tech_world/django_ListView_DetailView_basic/ |
0 commit comments