パイソン - ジャンゴ - 姓前へ次へを追加

ホームと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})

运行结果:

 

おすすめ

転載: www.cnblogs.com/sch01ar/p/11332864.html