ホームとEndを追加します。
views.py:
django.shortcutsレンダリングインポート app01インポートモデルから DEFのbook_list(要求): URLから取られた#パラメータ PAGE_NUM = request.GET.get( "ページ") を印刷(PAGE_NUM、タイプ(PAGE_NUM)) PAGE_NUM = INT(PAGE_NUMを) #定義する2つの変数がにどこから得たデータを保持 DATA_START =(PAGE_NUM - 1)* 10 DATA_ENDのPAGE_NUM * = 10 #冊の合計数 。TOTAL_COUNT = models.Book.objects.all()COUNT() #ショーどのように各ページの多くをデータ PER_PAGE = 10 表示するために必要なページの#総数 total_pageを、M = divmod(TOTAL_COUNT、 PER_PAGE) ページ番号のページでは、ほとんどの表示 MAX_PAGE = 11 half_max_page MAX_PAGE // 2 = #は、開始ページのページ番号を表示 half_max_page - PAGE_START = PAGE_NUMを ページの最後の#ページ番号の表示 PAGE_END = PAGE_NUM + half_max_page 小1の半分以上#現在のページ少ない場合 PAGE_START IF <= 1: PAGE_START = 1 PAGE_END = MAX_PAGE #総ページ数よりも、現在のページの半分を加えた方が大きければ PAGE_END場合> total_page : PAGE_END = total_page 。PAGE_START total_page = - + 1 MAX_PAGEの データが#ある場合 IF M: total_page + = 1。 all_book = models.Book.objects.all()[DATA_START:DATA_END] #スプライシングHTMLページングコード html_list = [] #ホームボタンの追加 html_list.appendを( '<LI> <a href="/books/?page=1">ホーム</a>の</李>') #表示ページを Iの範囲内(PAGE_START、PAGE_END + 1)のために: TMP = '<LI>の<a href="/book_list/?page={0}"> {0} </a>の</ LI>'フォーマット(I) html_list.append(TMP) #添加尾页按钮 html_list.append( '<LI> <a href="/books/?page={}">尾页</a>の</ LI>'形式(total_page)) page_html = "" .join(html_list)#拼接HTML的分页代码 リターンレンダリング(リクエスト、 "book_list.html"、{ "書籍":all_book、 "page_html":page_html})
book_list.html:
<!DOCTYPE HTML> <HTML LANG = "EN"> <HEAD> <メタ文字コード= "UTF-8"> <タイトル>书籍列表</ TITLE> <リンクのrel = "スタイルシート"のhref = "/静的/ストラップ/ CSS / bootstrap.min.css "> </ head> <body> <DIV CLASS ="コンテナ"> <テーブルクラス="テーブルのテーブルボーダー"> <THEAD> <TR> <TH>序号</番目> <第> ID </番目> <TH>书名</番目> </ TR> </ THEAD> <TBODY> {書籍%で書籍の%} <TR> <TD> {{forloop.counter}} </ TD> <TD> {{book.id}} </ TD> <TD> {{book.title}} </ TD> </ TR> {%のENDFOR%} </ TBODY> </ TABLE> <NAV ARIAラベル= "ページナビゲーション"> <ULクラス= "改ページ"> <LI> { {page_html |安全}} </ LI> </ UL> </ NAV> </ div> </ BODY> </ HTML>
結果:
前、次を追加します。
views.py:
django.shortcutsレンダリングインポートdjango.shortcutsレンダリングインポート app01インポートモデルから app01インポートモデルから DEFのbook_list(要求): URLから取られた#パラメータ PAGE_NUM = request.GET.get( "ページ") を印刷(PAGE_NUM、タイプ(PAGE_NUM)) PAGE_NUM = INT(PAGE_NUMを) #定義する2つの変数がにどこから得たデータを保持 DATA_START =(PAGE_NUM - 1)* 10 DATA_ENDのPAGE_NUM * = 10 #冊の合計数 。TOTAL_COUNT = models.Book.objects.all()COUNT() #ショーどのように各ページの多くをデータ PER_PAGE = 10 表示するために必要なページの#総数 total_pageを、M = divmod(TOTAL_COUNT、 PER_PAGE) ページ番号のページで最も表示 MAX_PAGE = 11 half_max_pageのMAX_PAGE // 2 = #は、開始ページのページ番号を表示 DEFのbook_list(要求): URLから取られた#パラメータ PAGE_NUM = request.GET.get( "ページ") を印刷(PAGE_NUM、タイプ(PAGE_NUM)) PAGE_NUM = INT(PAGE_NUMを) #定義する2つの変数がにどこから得たデータを保持 DATA_START =(PAGE_NUM - 1)* 10 DATA_ENDのPAGE_NUM * = 10 #冊の合計数 。TOTAL_COUNT = models.Book.objects.all()COUNT() #ショーどのように各ページの多くをデータ PER_PAGE = 10 表示するために必要なページの#総数 total_pageを、M = divmod(TOTAL_COUNT、 PER_PAGE) ページ番号のページでは、ほとんどの表示 MAX_PAGE = 11 half_max_page MAX_PAGE // 2 = PAGE_START = PAGE_NUM - half_max_page ページの最後の#ページ番号に表示 PAGE_END = PAGE_NUM + half_max_page #現在のページ少ない場合、小さな1の半分より PAGE_START IF <= 1: PAGE_START = 1 PAGE_END = MAX_PAGE #総ページより、現在のページの半分を加えた場合にも、大 IF PAGE_END> total_page: PAGE_END = total_page 。PAGE_START total_page = - + 1 MAX_PAGEの データがある場合# IF M: total_page + = 1。 all_book = models.Book.objects.all()[DATA_START:DATA_END] #タブコードスプライシングHTML = html_list [] #は、ホームボタンを追加しない html_list.append( '<LI> <a href="/book_list/?page=1">ホーム</a>の</李>') #最初のページがある場合は何を前 もしPAGE_NUM <= 1: html_list.append( '<LIクラス= "無効"> <a href="#"> <スパンARIA-隠さ= "真">«</ span>をする</a>ます。</ li> '.format(PAGE_NUM-1)) 他: #加一个上一页的标签 html_list.append(' <LI> <a href="/book_list/?page={}"> <スパンARIA-隠さ= "真。「>«</スパン> </a>の</ LI>」形式(PAGE_NUM-1)) #展示的页码 iについての範囲内(PAGE_START、PAGE_END + 1): #给当前页添加アクティブ かどう== PAGE_NUM: TMP = '<LIクラス= "アクティブ"> <aのhref="/book_list/?page={0}"> {0} </a>の</ LI>'形式(I)。 他: = TMP '<LI> <a href="/book_list/?page={0}"> </a>の{0} </ LI>'フォーマット(I) html_list.append(TMP) #最後の場合ページには、何の次のページはありません もしPAGE_NUM> = total_page: html_list.append( '<LIクラス= "無効"> <a href="#"> <スパンARIA-隠さ= "真の">»</ span>をする</a>ます。</ li>') 他: html_list。追加( '<LI> <a href="/book_list/?page={}"> <スパンARIA-隠さ= "真の">»</ span>をする</a>ます。</ li>」。フォーマット(PAGE_NUM + 1)) #添加尾页按钮 html_list.append( '<LI> <a href="/book_list/?page={}">尾页</a>の</ LI>'形式(total_page)) page_html = "" .join(html_list)#拼接HTML的には分页代码 (book_list.html "{ "":all_book、 "page_html":page_html書籍}リクエストを)描画戻ります"
book_list.html:
<!DOCTYPE HTML> <HTML LANG = "EN"> <HEAD> <メタ文字コード= "UTF-8"> <タイトル>书籍列表</ TITLE> <リンクのrel = "スタイルシート"のhref = "/静的/ストラップ/ CSS / bootstrap.min.css "> </ head> <body> <DIV CLASS ="コンテナ"> <テーブルクラス="テーブルのテーブルボーダー"> <THEAD> <TR> <TH>序号</番目> <第> ID </番目> <TH>书名</番目> </ TR> </ THEAD> <TBODY> {書籍%で書籍の%} <TR> <TD> {{forloop.counter}} </ TD> <TD> {{book.id}} </ TD> <TD> {{book.title}} </ TD> </ TR> {%ENDFOR%} </ TBODY> </ TABLE> <NAV ARIAラベル= "ページナビゲーション"> <ULクラス= "改ページ"> <LI> {{page_html |安全}} </ LI> </ UL> </ NAV> </ div> </ BODY> </ HTML>
結果:
その後の改善:
渡されたページのURL異常値ユーザパラメータの処理
例えば:
アクセス、/ 127.0.0.1 :? 8888 / book_list /ページ= A
アクセス、/ 127.0.0.1 :? 8888 / book_list /ページ= -1
間違って行くことができます
改良:
from django.shortcuts import render from app01 import models def book_list(request): # 从 URL 中取参数 page_num = request.GET.get("page") print(page_num, type(page_num)) # page_num 为 str 类型 # 书籍总数 total_count = models.Book.objects.all().count() # 每一页显示多少条数据 per_page = 10 # 总共需要多少页码来显示 total_page, m = divmod(total_count, per_page) # 如果还有数据 if m: total_page += 1 try: page_num = int(page_num) # 如果输入的页码数超过了最大的页码数,默认返回最后一页 if page_num > total_page: page_num = total_page # 如果输入的页码数小于 1,则返回第一页 if page_num < 1: page_num = 1 except Exception as e: # 当输入的页码不是正经数字的时候 默认返回第一页的数据 page_num = 1 # 定义两个变量保存数据从哪儿取到哪儿 data_start = (page_num - 1) * 10 data_end = page_num * 10 # 页面上最多展示的页码 max_page = 11 half_max_page = max_page // 2 # 页面上展示的页码的开始页 page_start = page_num - half_max_page # 页面上展示的页码的结束页 page_end = page_num + half_max_page # 如果当前页减一半比 1 小 if page_start <= 1: page_start = 1 page_end = max_page # 如果当前页加一半比总页码还大 if page_end > total_page: page_end = total_page page_start = total_page - max_page + 1 all_book = models.Book.objects.all()[data_start:data_end] # 拼接 html 的分页代码 html_list = [] # 添加首页按钮 html_list.append('<li><a href="/book_list/?page=1">首页</a></li>') # 如果是第一页,就没有上一页 if page_num <= 1: html_list.append('<li class="disabled"><a href="#"><span aria-hidden="true">«</span></a></li>'.format(page_num-1)) else: # 加一个上一页的标签 html_list.append('<li><a href="/book_list/?page={}"><span aria-hidden="true">«</span></a></li>'.format(page_num-1)) # 展示的页码 for i in range(page_start, page_end + 1): # 给当前页添加 active if i == page_num: tmp = '<li class="active"><a href="/book_list/?page={0}">{0}</a></li>'.format(i) else: tmp = '<li><a href="/book_list/?page={0}">{0}</a></li>'.format(i) html_list.append(tmp) # 如果是最后一页,就没有下一页 if page_num >= total_page: html_list.append('<li class="disabled"><a href="#"><span aria-hidden="true">»</span></a></li>') else: html_list.append('<li><a href="/book_list/?page={}"><span aria-hidden="true">»</span></a></li>'.format(page_num+1)) # 添加尾页按钮 html_list.append('<li><a href="/book_list/?page={}">尾页</a></li>'.format(total_page)) page_html = "".join(html_list) # 拼接 html 的分页代码 return render(request, "book_list.html", {"books": all_book, "page_html": page_html})
如果数据库中的数据数少于 max_page,则会显示负数的页数
例如数据库中只有 21 条数据:
改进:
from django.shortcuts import render from app01 import models def book_list(request): # 从 URL 中取参数 page_num = request.GET.get("page") print(page_num, type(page_num)) # page_num 为 str 类型 # 书籍总数 total_count = models.Book.objects.all().count() # 每一页显示多少条数据 per_page = 10 # 总共需要多少页码来显示 total_page, m = divmod(total_count, per_page) # 如果还有数据 if m: total_page += 1 try: page_num = int(page_num) # 如果输入的页码数超过了最大的页码数,默认返回最后一页 if page_num > total_page: page_num = total_page # 如果输入的页码数小于 1,则返回第一页 if page_num < 1: page_num = 1 except Exception as e: # 当输入的页码不是正经数字的时候 默认返回第一页的数据 page_num = 1 # 定义两个变量保存数据从哪儿取到哪儿 data_start = (page_num - 1) * 10 data_end = page_num * 10 # 页面上最多展示的页码 max_page = 11 # 如果总页码数小于页面上最多展示的页码 if total_page < max_page: max_page = total_page half_max_page = max_page // 2 # 页面上展示的页码的开始页 page_start = page_num - half_max_page # 页面上展示的页码的结束页 page_end = page_num + half_max_page # 如果当前页减一半比 1 小 if page_start <= 1: page_start = 1 page_end = max_page # 如果当前页加一半比总页码还大 if page_end > total_page: page_end = total_page page_start = total_page - max_page + 1 all_book = models.Book.objects.all()[data_start:data_end] # 拼接 html 的分页代码 html_list = [] # 添加首页按钮 html_list.append('<li><a href="/book_list/?page=1">首页</a></li>') # 如果是第一页,就没有上一页 if page_num <= 1: html_list.append('<li class="disabled"><a href="#"><span aria-hidden="true">«</span></a></li>'.format(page_num-1)) else: # 加一个上一页的标签 html_list.append('<li><a href="/book_list/?page={}"><span aria-hidden="true">«</span></a></li>'.format(page_num-1)) # 展示的页码 for i in range(page_start, page_end + 1): # 给当前页添加 active if i == page_num: tmp = '<li class="active"><a href="/book_list/?page={0}">{0}</a></li>'.format(i) else: tmp = '<li><a href="/book_list/?page={0}">{0}</a></li>'.format(i) html_list.append(tmp) # 如果是最后一页,就没有下一页 if page_num >= total_page: html_list.append('<li class="disabled"><a href="#"><span aria-hidden="true">»</span></a></li>') else: html_list.append('<li><a href="/book_list/?page={}"><span aria-hidden="true">»</span></a></li>'.format(page_num+1)) # 添加尾页按钮 html_list.append('<li><a href="/book_list/?page={}">尾页</a></li>'.format(total_page)) page_html = "".join(html_list) # 拼接 html 的分页代码 return render(request, "book_list.html", {"books": all_book, "page_html": page_html})
运行结果: