日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Django分頁器的用法詳解

瀏覽:53日期:2024-09-05 14:49:17
目錄1、準備基礎數據2、一次性展示數據3、引入分頁器附:drf分頁器的使用1.1 PageNumberPagination1.2 LimitOffsetPagination1.3 CursorPagination

Django是一個大而全的框架。需要明確的是,傳參進行分頁獲取分頁后的數據,一般都是通過向服務器發送get請求的方式實現的,在向后端服務發送查看數據的同時可以攜帶一個或多個參數并發送get請求來實現分頁查看功能

1、準備基礎數據

設計表模型

為了體現分頁的效果,需要先創建一個表并準備較多數據,模型如下

from django.db import models# Create your models here.class Book(models.Model): title = models.CharField(max_length=32) price = models.DecimalField(max_digits=9, decimal_places=2) # 9999999.99

執行數據庫遷移后,設計一個視圖函數,通過觸發視圖函數往此表中批量插入數據

Django中利用orm實現批量插入一般有兩種方式:單條插入或者利用bulk_create批量插入

最終翻譯轉換成sql語句也就類似于多條insert語句和一條insert的區別

def create_book(request): # 批量插入方式一 for i in range(100):Book.objects.create(title='book'+str(i),price=i*i)# 批量插入方式二 book_list = [] for i in range(100):book = Book(title='book'+str(i),price=i*i)book_list.append(book) Book.objects.bulk_create(book_list)return HttpResponse('添加成功')2、一次性展示數據

接下來通過模板語法一次性將數據展示到前端頁面

視圖函數如下

def get_books(request): book_list = Book.objects.all() return render(request, 'index.html', {'book_list': book_list})

模板頁面index.html如下

<!DOCTYPE html><html lang='en'><head> <meta charset='UTF-8'> <title>Title</title></head><body><ul> {% for book in book_list %} <li>{ book.title } : { book.price }</li> {% endfor %}</ul></body></html>

這時一次性訪問即展示了所有的book

3、引入分頁器

引入分頁器后,可以對全局分頁對象和單頁對象進行相關操作,相關語法

# 引入分頁器from django.core.paginator import Paginator... # 全局分頁器對象 paginator = Paginator([1,2,3,4,5,6,7,8,9,10],3) print(paginator.count) # 10 數據總數 print(paginator.num_pages) # 4 總頁數 print(paginator.page_range) # range(1, 5) 頁碼的列表 # 單頁對象 page = paginator.page(2) print(page.has_next()) # 是否有下一頁 print(page.next_page_number()) # 寫一頁的頁碼 print(page.has_previous()) # 是否有上一頁 print(page.previous_page_number()) # 上一頁的頁碼 # 取出單頁對象的值 print(page.object_list) # [4, 5, 6] for i in page: print(i)

在這里的例子中具體使用分頁器及模板語法,例如每頁取出8條,獲取用戶給出的頁碼條件數,返回相應頁的數據,默認不給出任何條件時返回第一頁的數據

from django.core.paginator import Paginator # 取出當前用戶頁碼 current_num = int(request.GET.get('page', 1)) book_list = Book.objects.all() paginator = Paginator(book_list, 8) page = paginator.page(current_num) return render(request,'index.html',{'page':page})

最后,可以利用bootstrap組件在頁面模板中添加翻頁的按鈕,在當前頁時按鈕加深,沒有上一頁時禁止點擊

...<body><ul> {% for book in page %} <li>{ book.title } : { book.price }</li> {% endfor %}</ul><nav aria-label='Page navigation'> <ul class='pagination'> {% if page.has_previous %} <li> <a href='http://m.b3g6.com/?page={ page.previous_page_number }' rel='external nofollow' aria-label='Previous'><span aria-hidden='true'>上一頁</span> </a> </li> {% else %} <li class='disabled'> <a href='http://m.b3g6.com/bcjs/17006.html#' rel='external nofollow' rel='external nofollow' aria-label='Previous'><span aria-hidden='true'>上一頁</span> </a> </li> {% endif %} {% for num in page_range %} {% if num == current_num %} <li class='active'><a href='http://m.b3g6.com/?page={ num }' rel='external nofollow' rel='external nofollow' >{ num }</a></li> {% else %} <li><a href='http://m.b3g6.com/?page={ num }' rel='external nofollow' rel='external nofollow' >{ num }</a></li> {% endif %} {% endfor %} <li> <a href='http://m.b3g6.com/bcjs/17006.html#' rel='external nofollow' rel='external nofollow' aria-label='Next'><span aria-hidden='true'>下一頁</span> </a> </li> </ul></nav></body>...

在視圖函數中:處理相關異常;傳遞相關參數;當頁碼較多時只顯示部分頁碼,例如最多時總共10個頁碼,當前頁碼始終在中間顯示;單獨處理出現邊界情況,負數頁碼的情況及最大頁碼用完的情況

from django.core.paginator import Paginator... # 取出當前用戶頁碼 current_num = int(request.GET.get('page', 1)) book_list = Book.objects.all() paginator = Paginator(book_list, 8) page = paginator.page(current_num) # 大于11頁時 if paginator.num_pages > 11:# 當前頁碼的后5頁數超過最大頁碼時,顯示最后10項if current_num + 5 > paginator.num_pages: page_range = range(paginator.num_pages - 10, paginator.num_pages + 1)# 當前頁碼的前5頁數為負數時,顯示開始的10項elif current_num - 5 < 1: page_range = range(1, 12)else: # 顯示左5頁到右5頁的頁碼 page_range = range(current_num - 5, current_num + 5 + 1) # 小于11頁時顯示所有頁碼 else:page_range = paginator.page_range return render(request, 'index.html', {'page': page, 'paginator': paginator, 'current_num': current_num, 'page_range': page_range})附:drf分頁器的使用

Django REST framework提供了分頁的支持。

可以在配置文件中設置全局的分頁方式,如:

REST_FRAMEWORK = { ’DEFAULT_PAGINATION_CLASS’: ’rest_framework.pagination.PageNumberPagination’, # 選用的分頁器 ’PAGE_SIZE’: 100 # 每頁數目}

也可通過自定義Pagination類,來為視圖添加不同分頁行為。在視圖中通過pagination_clas屬性來指明。例如:

from rest_framework.pagination import PageNumberPaginationclass MyPageNumberPagination(PageNumberPagination): # 設置url中的取多少頁的key page_query_param = ’page’ # 設置url中設置取數據條數的key page_size_query_param = ’size’ #設置每一頁的數據條數 page_size = 2 # 設置每一頁最多可取的數據數 max_page_size = 5 class Book2View(ListAPIView): queryset = models.Book.objects.all() serializer_class = BookModelSerializer pagination_class = MyPageNumberPagination #指定該視圖類的分頁器

注意:如果在視圖內關閉分頁功能,只需在視圖內設置pagination_class = None 即可,即在設置了全局分頁之后我們可以在局部禁用該設置。

drf 提供給我們的分頁器有PageNumberPagination、LimitOffsetPagination、CursorPagination。

1.1 PageNumberPagination

url形式:

http://127.0.0.1:8000/books/?page=1

可以在自定義類中定義的屬性有:

page_query_param :設置url中頁數的關鍵字,默認的是page。 page_size_query_param :設置url中每頁數據條數的關鍵字,默認的是None。 page_size :設置每一頁的數據條數。(必設) max_page_size : 設置每一頁最多可取的數據條數。(可選)

class MyPageNumberPagination(PageNumberPagination): page_size = 2 page_query_param = ’page’ page_size_query_param = ’size’ max_page_size = 5 class Book2View(ListAPIView): queryset = models.Book.objects.all() serializer_class = BookModelSerializer pagination_class = MyPageNumberPagination # APIView 中使用自定義分頁類進行分頁操作class Pager(APIView): def get(self,request,*args,**kwargs):# 獲取所有數據ret=models.Book.objects.all()# 創建分頁對象page=MyPageNumberPagination()# 在數據庫中獲取分頁的數據page_list=page.paginate_queryset(ret,request,view=self)# 對分頁進行序列化ser=BookSerializer1(instance=page_list,many=True)# return Response(ser.data)# 這個也是返回Response對象,但是比基本的多了上一頁,下一頁,和總數據條數(了解)return page.get_paginated_response(ser.data)1.2 LimitOffsetPagination

url形式:

http://127.0.0.1/four/books/?limit=100&offset=400

可以在自定義類中定義的屬性有:

default_limit :默認限制,默認值與PAGE_SIZE設置一致。 limit_query_param : limit參數名,默認為limit。 offset_query_param : offset參數名,默認offset。 max_limit : 最大limit限制,默認None。

class MyLimitOffsetPagination(LimitOffsetPagination): default_limit = 3 limit_query_param = ’limit’ max_limit = None offset_query_param = ’offset’ class Book2View(ListAPIView): queryset = models.Book.objects.all() serializer_class = BookModelSerializer pagination_class = MyLimitOffsetPagination # APIView 中使用自定義分頁類進行分頁操作class Pager(APIView): def get(self,request,*args,**kwargs):# 獲取所有數據ret=models.Book.objects.all()# 創建分頁對象page=LimitOffsetPagination()# 在數據庫中獲取分頁的數據page_list=page.paginate_queryset(ret,request,view=self)# 對分頁進行序列化ser=BookSerializer1(instance=page_list,many=True)# return page.get_paginated_response(ser.data)return Response(ser.data)1.3 CursorPagination

url形式:

http://127.0.0.1/four/books/?cursor=cD0xNQ%3D%3D

可以在自定義類中定義的屬性有:

cursor_query_param:默認查詢字段,不需要修改。 page_size:每頁數目。 ordering:按什么排序,需要指定。

class MyCursorPagination(CursorPagination): cursor_query_param = ’cursor’ page_size = 2 ordering = ’-id’class Book2View(ListAPIView): queryset = models.Book.objects.all() serializer_class = BookModelSerializer pagination_class = MyCursorPagination # APIView 中使用自定義分頁類進行分頁操作class Pager(APIView): def get(self,request,*args,**kwargs):# 獲取所有數據ret=models.Book.objects.all()# 創建分頁對象page=CursorPagination()page.ordering=’nid’# 在數據庫中獲取分頁的數據page_list=page.paginate_queryset(ret,request,view=self)# 對分頁進行序列化ser=BookSerializer1(instance=page_list,many=True)# 可以避免頁碼被猜到return page.get_paginated_response(ser.data)

以上就是Django分頁器的用法詳解的詳細內容,更多關于Django分頁器的用法的資料請關注好吧啦網其它相關文章!

標簽: Django
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
免费观看久久久4p| 成人在线视频区| 亚洲精品97| 婷婷成人基地| jiujiure精品视频播放| 午夜国产精品视频| 在线国产一区二区| 99视频精品免费观看| 免费久久99精品国产自在现线| 国产精品丝袜xxxxxxx| 午夜一区在线| 日韩国产高清在线| 国产精品v日韩精品v欧美精品网站| 国产欧美在线观看免费| 国产精品白丝一区二区三区| 国产精品白丝一区二区三区| 精品三级av| 中文字幕高清在线播放| 久久蜜桃精品| 鲁大师影院一区二区三区| 婷婷综合成人| 欧美xxxx性| 免费污视频在线一区| 日韩午夜免费| 欧美精品三级在线| 国产在线观看www| 欧美在线网站| 青青国产91久久久久久| 久久久久亚洲精品中文字幕| 国产资源在线观看入口av| 99久久久久| 久久亚洲风情| 国产精品欧美三级在线观看 | 好吊视频一区二区三区四区| 丝袜美腿高跟呻吟高潮一区| 国产无遮挡裸体免费久久| 成人综合一区| 国产精品美女久久久浪潮软件| 久久国内精品自在自线400部| 久久久久久自在自线| 香蕉久久夜色精品国产| 欧美日韩18| 日韩理论片av| 亚洲欧美在线专区| 国产成人精品一区二区三区免费| 黑丝一区二区三区| 国产探花在线精品一区二区| 日本综合字幕| 日韩综合一区二区| 美女一区网站| 日韩一区精品| 日本午夜大片a在线观看| 老司机精品久久| 久久精品二区亚洲w码 | 99精品电影| 亚洲精品动态| 中文在线免费视频| 天堂av一区| 99免费精品| 国产日韩免费| 国产精品91一区二区三区| 日本精品在线播放| 欧美精品日日操| 日韩二区在线观看| 亚洲手机视频| 嫩草伊人久久精品少妇av杨幂| 九一精品国产| 久久中文欧美| 亚洲精品一级| 久久精品导航| 久久国产尿小便嘘嘘| 激情偷拍久久| 久久精品国产亚洲aⅴ | 国产亚洲精品美女久久| 午夜欧美理论片| 国产一区二区三区四区五区传媒| 最新国产精品久久久| 超级白嫩亚洲国产第一| 日韩国产欧美视频| 国产一区导航| 精品三级久久| 久久精品系列| 欧美精品国产一区| 国产免费成人| 欧洲亚洲一区二区三区| 国产精品国产三级在线观看| 中文字幕av一区二区三区人| 日韩网站中文字幕| 国产精久久久| 日韩一区网站| 久久亚洲欧美| 亚洲大全视频| 亚洲不卡系列| 福利一区二区| 国产精品欧美大片| 婷婷五月色综合香五月| 国产亚洲高清视频| 欧美一区二区三区激情视频| 久久精品免费看| 国产精品亚洲产品| 欧美日本精品| 日韩av不卡一区二区| 亚洲一区二区三区四区电影| 成人av二区| 激情欧美一区| 久久精品123| 日韩伦理一区| 日韩一区二区三区免费播放| 久久一区视频| 九九九精品视频| 美女视频免费精品| 久久国产精品色av免费看| 日韩精品三级| 蜜臀久久99精品久久久久宅男| 久久高清精品| 国产一区日韩欧美| 欧美性感美女一区二区| 99热精品久久| 欧美日韩精品一本二本三本| 欧美成人日韩| 欧美日韩免费观看一区=区三区 | 日韩制服丝袜先锋影音| 红桃视频国产精品| 最新日韩欧美| 中文日韩在线| 日本大胆欧美人术艺术动态| 欧美女激情福利| 久久国产精品久久w女人spa| 免费视频最近日韩| 日韩一区免费| 国产激情精品一区二区三区| 美女精品一区二区| 日韩在线精品| 亚洲一级高清| 亚洲免费高清| 蜜臀久久99精品久久久久久9| 日韩欧美中文字幕在线视频| 热久久久久久| 精品视频免费| 久久免费高清| 爽好多水快深点欧美视频| 蜜桃伊人久久| 欧美日韩亚洲一区三区| 精品三区视频| 久久九九99| 在线亚洲自拍| 青青青国产精品| 国产成人精品亚洲线观看| 99久久婷婷这里只有精品| 亚洲欧美日韩一区在线观看| 欧美综合社区国产| 国产一区二区三区视频在线| 欧美一区二区性| 亚州av日韩av| 乱一区二区av| 今天的高清视频免费播放成人| 石原莉奈在线亚洲二区| 日韩av中文字幕一区二区| 国产精品1区| 久久久久一区| 日韩精品视频网| 日韩综合在线| 99日韩精品| 国产精品成人**免费视频| 日本综合字幕| 亚洲精品韩国| 国产在线不卡一区二区三区| 91久久久精品国产| 国产欧美日韩在线一区二区| 在线观看精品| 日韩综合小视频| a天堂资源在线| 亚洲免费一区二区| 你懂的国产精品| 野花国产精品入口| 国产精品v一区二区三区| 国产中文一区| 国产日韩一区二区三区在线播放 | www.com.cn成人| 老色鬼久久亚洲一区二区| 麻豆成人91精品二区三区| 亚洲免费高清| 精品久久久亚洲| 亚洲欧美专区| 亚洲精选成人| 蜜桃视频一区二区| 日韩精品一级二级| 国产成人免费av一区二区午夜| 欧美日韩第一| 欧美日韩亚洲一区在线观看| 久久精品导航| 国产精品玖玖玖在线资源| 1024精品久久久久久久久| 久久伊人久久| 免费在线观看不卡| 欧美不卡高清一区二区三区| 国产欧美一区二区精品久久久| 亚洲精品91| 91欧美在线| 18国产精品|