強化されたページングコンポーネントDjangoフレームワークの下で

記事の同期によるこの記事では、庭園をブログにプッシュされ、表示レイアウトが間違っている可能性があり、私を許してください!

説明:Djangoフレームワーク構築されたページネーションは、それだけで複雑な機能を実装することは困難簡単なのニーズを満たすことができます。

実装コード:

#!は/ usr / binに/ ENVのpython3 
# - * -コーディング:UTF-8 - - * 
__auth__ = '歌魏' 

インポートmark_safeをdjango.utils.safestringから
数学インポート切り上げから

クラスのページネータ''「カスタムページング機能、サポート設定]タブのプロパティ、ショーのサポートページには、ページジャンプの後に支持要素を配置、他のGETパラメータの保持をサポートします。
    関連可能なプロパティを次のように
        位置を開始、データ収集を開始し
        、データ取得終了位置に終了
        prvePage前のページ
        NEXTPAGE次のページ
        maxPage総ページ
        pvreCode前の表示テキスト
        nextCode次に表示テキスト
        ATTRタグを取得し、共通の属性
        、このページを取得するcurrent_attrをタグ属性
        テンプレート言語の中で直接使用されるHTMLを生成するHTMLタグ 
        ストラップストラップ直接改ページスタイルは、ブートストラップをインポートする必要が
        を有効にするだけブートストラップオプション設定bootstrap_sizeをするときのテンプレートLG(大)、SM(小)
        で指定されたIDをHTMLに配置位置のサポートページングジャンプした後
    、関連する次の方法使用できます。
        SETATTR(ATTR、current_attr =なし、継承=真)は、labelプロパティを設定します
        '' ' 

    。__init __(自己、totalCountプロパティ、perPage、currentPageに=をDEF 1、pagerNumRange = 0です。argname =「P」、kwargsからは= {}):
        「」「データtotalCountプロパティの合計数
            perPageページ番号が示す
            現在のページcurrentPageに
            (0)が表示されていないどのように多くのデジタルデフォルト中間pagerNumRange次/前のページの表示を
            argnameのをGETへページの伝送パラメータ名のデフォルトはPの
            kwargsからは、補体他のパラメータは、一般的に空または直接`` request.GET``にあるGET 
        「」 ' 
        self.maxPage = CEIL(totalCountプロパティ/ perPage) 試してみる 
            。self.currentPage 1 = 
            自己。currentPageに= INT(currentPageに)
        除く:
        self.pagerNumRange = self._pager_num_range(pagerNumRange)
        self.argName = argnameの
        self.kwargs = '' 
        kについて、kwargs.itemsでV():
            もしK = self.argName:!
                self.kwargs + =「%S =% S&」%(K、V)
        self.end = self.currentPage * perPage 
        self.start = self.end - perPage 
        self.prvePage = self.currentPage - 1の場合self.currentPage他> 1 
        self.nextPage = self.currentPage + 1であればself.currentPage <self.maxPage他self.maxPage 
        self.pattern = '<{ATTR} HREF = "?{kwargsから} {argnameの} = {HREF}"> {内容} </a>の' 
        セルフ。 ATTR、self._current_attr = ''、 '' 
        自己。bootstrap_size = ''
        = self.position '' 
        self.pvreCode、self.nextCode = '&LAQUO;'、 '表示&raquo;' 

    @Property 
    DEFのcurrent_attr(セルフ):
        ''このページのタグは'' '属性を返す' 
        :self._current_attrは、IF 
            自己を返します。 _current_attr 
        他:
            self.attr返す

    :(セルフ、pager_num_range)DEF _pager_num_rangeを
        '' 'ページ番号のページ表示リスト'を
        IF pager_num_range == 0:
            戻る[] 
        他:
            スタート= INT(self.currentPage - (pager_num_range -1) / 2)
            エンド= INT((+ self.currentPage(pager_num_range - 1)/ 2))
            。[スタート] <1 IF:
                終了+ = 1 -スタート
                開始= 1 
                IF終了> self.maxPage:
                    エンド= self.maxPage 
            IFエンド> self.maxPage:
                開始-終了= - self.maxPage 
                エンド= self.maxPage 
                IFスタート<1:。 スタート1 = 
        範囲(開始、終了を返します+ 1)

    DEF SETATTR(セルフ、ATTR、current_attr =なし、継承=真):
        「」「タグ属性セット
            通常のタグ属性attrのは、
            現在のページの追加のプロパティに設定current_attr 
            「」現在のページ属性は、一般的なラベル属性継承されます継承」
        自己を。 = ATTR '' 
        Kため、V attr.itemsに():
            self.attr + = '%S = "%S"' %(K、V)
        もしcurrent_attr:
            self._current_attr = '' 
            であれば継承:
                kについて、attr.items()におけるV:
                    current_attrにおけるk場合:
                        self._current_attr + = '%S = "%s"は' %(K、current_attr [K] )
                    他:
                        self._current_attr + = '%S = "%s"は' %(K、V)
                current_attr.keys()におけるkの- attr.keys():
                    self._current_attr + =「%S = "%sの" '%(K、current_attr [K])
            他:
                kについて、current_attr.itemsにおけるV():
                    self._current_attr + = '%S = "%s"は' %(K、V)である

    プロパティ
    )(自己でないHTMLですDEF:
        ' ' 'HTMLを生成り''' 
        pagelist = '' 
                + = self.pattern.format pagelist(ATTR = self.attr、HREF =のSTR(R)+位置、 
        位置= '#' +自己。位置であればself.position他の'' 
        の場合self.currentPage> 1:
            pagelist = self.pattern.format(ATTR = self.attr、HREF =のSTR(self.prvePage)+位置、
                                           kwargsから= self.kwargs、argnameの= self.argName、コンテンツ= self.pvreCode)
        self.pagerNumRangeにおけるRについて:
            もしR == self.currentPage:
                pagelist + = self.pattern.format(ATTR = self.current_attr、HREF =のSTR(R)+位置、
                                                kwargsから= self.kwargs、argnameの= self.argName、コンテンツ= R)
            他:
                                                kwargsから= self.kwargs、argnameの= self.argName、コンテンツ= R)
        self.currentPage <self.maxPage場合:
            pagelist + = self.pattern.format(ATTR = self.attr、HREF =のSTR(self.nextPage)+位置、
        前=「」」
                                            kwargsから= self.kwargs、argnameの= self.argName、コンテンツ= self.nextCode)
        リターンmark_safe(pagelist)

    @property 
    defのブートストラップ(自己):
        '直接使用ブートストラップ样式' 
        HTML = ''」
        <NAV ARIA-ラベル= "ページナビゲーション"> 
          <ULクラス="ページネーション"> 
            {ページ} 
          </ UL> 
        </ NAV> 
        ''」
            <LI {無効}> 
              <a href="{prvePage}" aria-label="Previous"> 
                <スパンARIA-隠さ= "真の">%sの</ span>の
              </a>の
            </ LI> 
        '' '%self.pvreCode 
        次に= '''
            <LI {ディセーブル}> 
              <a href="{nextPage}" aria-label="Next"> 
                <スパンARIA-隠れ= "真">%S </スパン> 
              </a>の
            </ LI> 
        ''」 %self.nextCode 
        pagelist = ' 
        位置= '#' + self.positionもしそうself.position' 
        self.pagerNumRangeにおけるRについて:
            もしR == self.currentPage: 
                pagelist + =' <LIクラス=」アクティブ "> <a href="?%s%s=%s%s">%S <スパンクラス=" SR-のみ ">(現在の)</スパン> </a>の</ LI>」%( self.kwargs、self.argname、R、位置、R)
            他:
                pagelist + =「<LI> <A HREF = "?%S%S =%S%S">%S </a>の</ LI> '%(self.kwargs、self.argName、R、位置、R)
        IF(中self.bootstrap_size' LG 」、 'SM'):
            HTML = html.replace( 'ページネーション'、 '改ページpagination-%s'は%self.bootstrap_size)
        self.currentPage> 1の場合: 
            '?%S%S =%s'の前= Previous.format(prvePage =%(self.kwargs、self.argName、self.prvePage) +位置、無効= '')
        他:
            前= Previous.format(prvePage = '#'、=無効'')クラス= "無効"を
        self.currentPage場合<self.maxPage:
            次= Next.format(NEXTPAGE =」 ?%S%S =%s'は%(self.kwargs、self.argName、self.nextPage)+位置、無効= '')
        他:
            次= Next.format(NEXTPAGE = '#'、= 'クラス= "無効"')を無効
        リターンmark_safeを(html.format(ページ=前+ pagelist +次))

例を呼び出します。

ビューで中の.py

ページ=ページネータ(LEN (USER_LIST) 15 P 7 'P' request.GET)

page.setattr(ATTR = { 'クラス' 'BTN BTNデフォルト' } current_attr = { 'クラス' 'BTNデフォルトアクティブBTN' })

page.size = 'LG'

リターンレンダリング(リクエスト、'ウェブ/ index.htmlを' { 'PAGE':ページ、 'USER_LIST':USER_LIST [page.start:page.end]})

テンプレートtempaltesで

{{ PAGE HTML }} 或者 {{ PAGE ブートストラップ}}

ブートストラップブートストラップあまりセットせずに、直接、改ページのスタイルを使用し、HTMLの方法は、など、ページネータプロパティを設定することで柔軟性があります。

おすすめ

転載: www.cnblogs.com/lazyfish007/p/11487542.html