記事の同期によるこの記事では、庭園をブログにプッシュされ、表示レイアウトが間違っている可能性があり、私を許してください!
説明: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の方法は、など、ページネータプロパティを設定することで柔軟性があります。