ホームページ  >  記事  >  バックエンド開発  >  Django のページング例の紹介

Django のページング例の紹介

零下一度
零下一度オリジナル
2017-06-27 09:54:161248ブラウズ

ページング機能は、すべての Web サイトで必要です。ページングでは、ユーザーの入力に基づいて、データベース テーブル内のページに表示されるデータの開始位置を実際に計算します。

ページング要件を決定します:

1. 每页显示的数据条数
2. 每页显示页号链接数
3. 上一页和下一页
4. 首页和末页

レンダリング:

まず、django の組み込みページング関数を使用してページング クラスを記述します:

 1 from django.core.paginator import Paginator, Page      # 导入django分页模块 2  3  4 class PageInfo(object): 5     def __init__(self, current_page, all_count, base_url, per_page=10, show_page=11): 6         """ 7  8         :param current_page: 当前页 9         :param all_count: 总页数10         :param base_url: 模板11         :param per_page: 每页显示数据条数12         :param show_page: 显示链接页个数13         """14         #若url错误,默认显示第一页(错误类型可能为:空页面编号,非整数型页面编号)15         try:16             self.current_page = int(current_page)17         except Exception as e:18             self.current_page = 119         20         #根据数据库信息条数得出总页数            21         a, b = divmod(all_count, per_page)22         if b:23             a += 124         self.all_page = a   
25         26         self.base_url = base_url27         self.per_page = per_page28         self.show_page = show_page29 30     #当前页起始数据id31     def start_data(self):       
32         return (self.current_page - 1) * self.per_page33 34     #当前页结束数据id35     def end_data(self):     
36         return self.current_page * self.per_page37     38     #动态生成前端html39     def pager(self):40         page_list = []41         half = int((self.show_page - 1)/2)42         #如果:总页数 < show_page,默认显示页数范围为: 1~总页数43         if self.all_page < self.show_page:44             start_page = 145             end_page = self.all_page + 146         #如果:总页数 > show_page47         else:48             #如果:current_page - half <= 0,默认显示页数范围为:1~show_page49             if self.current_page <= half:50                 start_page = 151                 end_page = self.show_page + 152             else:53                 #如果:current_page + half >总页数,默认显示页数范围为:总页数 - show_page ~ 总页数54                 if self.current_page + half > self.all_page:55                     end_page = self.all_page + 156                     start_page = end_page - self.show_page57                 else:58                     start_page = self.current_page - half59                     end_page = self.current_page + half + 160 61         #首页62         first_page = "<li><a href=&#39;%s?page=%s&#39;>首页</a></li>" %(self.base_url, 1)63         page_list.append(first_page)64 65         #上一页(若当前页等于第一页,则上一页无链接,否则链接为当前页减1)66         if self.current_page <= 1:67             prev_page = "<li><a href=&#39;#&#39;>上一页</a></li>"68         else:69             prev_page = "<li><a href=&#39;%s?page=%s&#39;>上一页</a></li>" %(self.base_url, self.current_page-1)70         page_list.append(prev_page)71 72         #动态生成中间页数链接73         for i in range(start_page, end_page):74             if i == self.current_page:75                 temp = "<li class=&#39;active&#39;><a href=&#39;%s?page=%s&#39;>%s</a></li>" %(self.base_url, i, i)76             else:77                 temp = "<li><a href=&#39;%s?page=%s&#39;>%s</a></li>" % (self.base_url, i, i)78             page_list.append(temp)79 80         #下一页(若当前页等于最后页,则下一页无链接,否则链接为当前页加1)81         if self.current_page >= self.all_page:82             next_page = "<li><a href=&#39;#&#39;>下一页</a></li>"83         else:84             next_page = "<li><a href=&#39;%s?page=%s&#39;>下一页</a></li>" %(self.base_url, self.current_page+1)85         page_list.append(next_page)86 87         #末页(若总页数只有一页,则无末页标签)88         if self.all_page > 1:89             last_page = "<li><a href=&#39;%s?page=%s&#39;>末页</a></li>" % (self.base_url, self.all_page)90             page_list.append(last_page)91 92         return ''.join(page_list)

次に、ビューにメソッドを記述します (ここで記述されています) app01 Medium):

1 from utils.pagnition import PageInfo    # 从文件中导入上步自定义的分页模块2 3 def custom(request):4     all_count = models.UserInfo.objects.all().count()   # 获取要显示数据库的总数据条数5     page_info = PageInfo(request.GET.get('page'), all_count, '/custom.html/',)      # 生成分页对象6     user_list = models.UserInfo.objects.all()[page_info.start_data():page_info.end_data()]      # 利用分页对象获取当前页显示数据7     return render(request, 'custom.html', {'user_list': user_list, 'page_info': page_info})     # 模板渲染

次に、テンプレート ディレクトリに「custom.html」ファイルを書き込みます:

 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4     <meta charset="UTF-8"> 5     <title>customers</title> 6 {#    引入bootstrap样式#} 7     <link rel="stylesheet" href="/static/plugins/bootstrap-3.3.7-dist/css/bootstrap.css?1.1.11"> 8 </head> 9 <body>10 <h1>customers</h1>11 {#当前页显示的数据#}12 <ul>13     {% for row in user_list %}14         <li>{{ row.name }}</li>15     {% endfor %}16 </ul>17 18 {#分页#}19     <nav aria-label="Page navigation">20       <ul class="pagination">21 {#                传入page_info.pager#}22           {{ page_info.pager|safe }}23       </ul>24     </nav>25 26 </body>27 </html>

最後に、URL 関係 (urls.py) を追加します:

1 from django.conf.urls import url2 from django.contrib import admin3 from app01 import views as app01_views4 5 urlpatterns = [6     url(r'^custom.html/$', app01_views.custom),7 ]

この時点で、 Django のページング機能は、さまざまなビジネス ページに適用できるページング モジュールをカスタマイズします。

参考資料:

1. Pythonへの道【その17】:Django【上級編】

以上がDjango のページング例の紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。