django分頁

方法一:使用pure_pagination進行分頁

1. pure_pagination介紹

pure_pagination基于并且兼容django原生的pagination模塊。

2. 安裝pure_pagination

pip install django-pure-pagination

3. 配置

  • 添加 pure_pagination 到 INSTALLED_APPS
INSTALLED_APPS = (
    ...
    'pure_pagination',
)

A few settings can be set within settings.py

PAGINATION_SETTINGS = {
    'PAGE_RANGE_DISPLAYED': 10,
    'MARGIN_PAGES_DISPLAYED': 2,
    'SHOW_FIRST_PAGE_WHEN_INVALID': True,
}

4. 代碼

  • 視圖函數
from pure_pagination import Paginator, EmptyPage, PageNotAnInteger
class IndexView(View):
    def get(self, request):
        # 文章列表
        article_list = Article.objects.filter()
        # 分頁數據
        try:
            page = int(request.GET.get('page', 1))  # 頁碼
            paginator = Paginator(article_list, 10, request=request)  # 獲取有多少頁
            article_list = paginator.page(page)  # 獲取指定頁的數據
        except Exception as e:
            return HttpResponseRedirect('/')
       
        return render(request, 'index.html', {
            'article_list': article_list
        })
  • 模板
<ul class="pagination">
 {# 上一頁 #}
 {% if article_list.has_previous %}
    <li class="waves-effect"><a href="?page={{ article_list.previous_page_number.querystring }}"><i class="material-icons">chevron_left</i></a></li>
{% else %}
    <li class="disabled"><a href="#!"><i class="material-icons">chevron_left</i></a></li>
{% endif %}
{% for page in article_list.pages %}
     {% if page %}
         {% ifequal page article_list.number %}
              {# 當前頁頁 #}
              <li class="active"><a>{{ page }}</a></li>
         {% else %}
              {# 指定頁 #}
              <li class="waves-effect"><a href="?{{ page.querystring }}">{{ page }}</a></li>
         {% endifequal %}
     {% else %}
         <li class="waves-effect"><a href="#">...</a></li>
     {% endif %}
{% endfor %}
{# 下一頁 #}
{% if article_list.has_next %}
      <li class="waves-effect"><a href="?page={{ article_list.next_page_number.querystring }}"><i class="material-icons">chevron_right</i></a></li>
{% else %}
      <li class="disabled"><a href="#!"><i class="material-icons">chevron_right</i></a></li>
{% endif %}

方法二:使用django原生的分頁方法

使用原生的分頁方法要想實現一個比較好的結果需要使用templatetags,有點復雜,下面我們一點一點來

1. 首先建立模板標簽

app/
    templatetags/
        __init__.py
        paginate_tags.py

2. 編碼

  • 視圖函數
def question_index(request):
    article_list = Article.objects
    context = {
        'article_list': article_list,
    }
    return render(request, 'app/index.html', context)
  • paginate_tags
from django import template
from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage
register = template.Library()
// 這是定義模板標簽要用到的
@register.simple_tag(takes_context=True)
def paginate(context, object_list, page_count):
    // context是Context 對象,object_list是你要分頁的對象,page_count表示每頁的數量
    left = 3
    right = 3
    // 獲取分頁對象
    paginator = Paginator(object_list, page_count)
    // 從請求中獲取頁碼號
    page = context['request'].GET.get('page')
   
    try:
        object_list = paginator.page(page) # 根據頁碼號獲取數據頁碼對象
        context['current_page'] = int(page) # 將當前頁碼號封裝進context中
        // 獲取頁碼列表
        // pages = paginator.page_range
        pages = get_left(context['current_page'], left, paginator.num_pages) + get_right(context['current_page'], right,                                                                                  paginator.num_pages)
    except PageNotAnInteger:
        object_list = paginator.page(1) # 獲取首頁數據頁碼對象
        context['current_page'] = 1
        // pages = paginator.page_range
        pages = get_right(context['current_page'], right, paginator.num_pages)
    except EmptyPage:
        // 用戶傳遞的是一個空值,則把最后一頁返回給他
        object_list = paginator.page(paginator.num_pages)
       // num_pages為總分頁數
        context['currten_page'] = paginator.num_pages
        // pages = paginator.page_range
        pages = get_left(context['current_page'], left, paginator.num_pages)
    
    context['questions'] = object_list
    context['pages'] = pages  # 頁碼列表
    context['last_page'] = paginator.num_pages
    context['first_page'] = 1
    // 用于判斷是否加入省略號
    
    try:
        context['pages_first'] = pages[0]
        context['pages_last'] = pages[-1] + 1
    except IndexError:
        context['pages_first'] = 1
        context['pages_last'] = 2
    return ''
def get_left(current_page, left, num_pages):
    """
    輔助函數,獲取當前頁碼的值得左邊兩個頁碼值,要注意一些細節,比如不夠兩個那么最左取到2
    ,為了方便處理,包含當前頁碼值,比如當前頁碼值為5,那么pages = [3,4,5]
    """
    if current_page == 1:
        return []
    elif current_page == num_pages:
        l = [i - 1 for i in range(current_page, current_page - left, -1) if i - 1 > 1]
        l.sort()
        return l
    l = [i for i in range(current_page, current_page - left, -1) if i > 1]
    l.sort()
    return l
def get_right(current_page, right, num_pages):
    """
    輔助函數,獲取當前頁碼的值得右邊兩個頁碼值,要注意一些細節,
    比如不夠兩個那么最右取到最大頁碼值。不包含當前頁碼值。比如當前頁碼值為5,那么pages = [6,7]
    """
    if current_page == num_pages:
        return []
    return [i + 1 for i in range(current_page, current_page + right - 1) if i < num_pages - 1]
  • 模板
<ul class="pagination">
    {# 判斷是否還有上一頁,確定是否激活上一頁按鈕 #}
    {% if questions.has_previous %}
        <li class="waves-effect"><a href="?page={{ questions.previous_page_number }}"><i class="material-icons">chevron_left</i></a></li>
    {% else %}
        <li class="disabled"><a href="#!"><i class="material-icons">chevron_left</i></a></li>
    {% endif %}

    { # 永遠顯示第一頁 #}
    {% if first_page == current_page %}
        <li class="active"><a>1</a></li>
    {% else %}
        <li class="waves-effect"><a href="?page=1">1</a></li>
    {% endif %}

    {# 2以前的頁碼號要被顯示成省略號 #}
    {% if pages_first > 2 %}
        <li class="waves-effect"><a href="#">...</a></li>
    {% endif %}

    {% for page in pages %}
        {% if page == current_page %}
            <li class="active"><a>{{ page }}</a></li>
        {% else %}
            <li class="waves-effect"><a href="?page={{ page }}">{{ page }}</a></li>
        {% endif %}
    {% endfor %}

    {# pages最后一個值+1的值小于最大頁碼號,說明有頁碼號需要被省略號替換 #}
    {% if pages_last < last_page %}
        <li class="waves-effect"><a href="#">...</a></li>
    {% endif %}
    
    {# 永遠顯示最后一頁的頁碼號,如果只有一頁則前面已經顯示了1就不用再顯示了 #}
    {% if last_page != 1 %}
        {% if last_page == current_page %}
            <li class="active"><a>{{ last_page }}</a></li>
        {% else %}
            <li class="waves-effect"><a href="?page={{ last_page }}">{{ last_page }}</a></li>
        {% endif %}
    {% endif %}

    {# 判斷是否還有下一頁,確定是否激活下一頁按鈕 #}
    {% if questions.has_next %}
        <li class="waves-effect"><a href="?page={{ questions.next_page_number }}"><i class="material-icons">chevron_right</i></a></li>
    {% else %}
        <li class="disabled"><a href="#!"><i class="material-icons">chevron_right</i></a></li>
    {% endif %}
</ul>

3. 使用

{% load paginate_tags %}
{% paginate article_list 3 %}   # 對應模板標簽中的函數paginate(context, object_list, page_count),context是默認傳入的,article_list代表object_list,3代表每頁的數量
{% for article in article_list %}
    <section class="post">
        <h1>{{ article.title }}</h1>
        <p>{{ article.content }}</p>
        ...
    </section>
{% include 'pagination.html' %}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,327評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,996評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,316評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,406評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,128評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,524評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,576評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,759評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,310評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,065評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,249評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,821評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,479評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,909評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,140評論 1 290
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,984評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,228評論 2 375

推薦閱讀更多精彩內容

  • 我們先在 shell 中演示分頁器的用法: 分頁器示例 現在我們在 view 中使用分頁器: 瀏覽器打開:http...
    SingleDiego閱讀 1,619評論 2 3
  • 成果: 代碼:在之后的步驟中在相信說明吧 步驟: 1.這個mongoengine需要pip安裝的pip insta...
    泠泠七弦客閱讀 4,067評論 2 0
  • Django中已經實現了很多功能,基本上只要我們需要的功能,都能夠找到相應的包。要在Django中實現分頁顯示,只...
    leyu閱讀 548評論 0 2
  • 我們要實現如下樣子的分頁界面 在不借助于第三方Django APP的情況下,僅僅使用Django框架提供的分頁(P...
    Maslino閱讀 1,874評論 0 4
  • 林逸維初見牧琪是在上選修課的教室里。 上課的鈴聲剛剛響過,教授正欲翻開書本授課。“嘭”一聲,她幾乎...
    里力閱讀 484評論 0 0