翼度科技»论坛 编程开发 python 查看内容

django中分页器的使用方法(初、高级版本)

5

主题

5

帖子

15

积分

新手上路

Rank: 1

积分
15
效果图:

方法如下:
1.简单版(较繁琐但是直观):

1.1 定义数据库模型(models.py)中添加表
  1. class ProductSample(models.Model):
  2.     # 示例商品表
  3.     id = models.AutoField(db_column='ID', primary_key=True)  # Field name made lowercase.
  4.     item_id = models.CharField(verbose_name="用户ID",max_length=255, blank=True, null=True)
  5.     title = models.TextField(verbose_name="标题",blank=True, null=True)
  6.     pict_url = models.CharField(verbose_name="商品图片链接",max_length=255, blank=True, null=True)
  7.     category = models.TextField(verbose_name="类别",blank=True, null=True)
  8.     brand_id = models.CharField(verbose_name="品牌ID",max_length=255, blank=True, null=True)
  9.     seller_id = models.CharField(verbose_name="卖家ID",max_length=255, blank=True, null=True)
  10.     def __str__(self):
  11.         return self.title
  12.     # class Meta:
  13.     #     verbose_name = '商品信息'
  14.     #     verbose_name_plural = verbose_name
  15.     class Meta:
  16.         managed = False
  17.         db_table = 'product_sample'
复制代码
1.2 路由(urls.py)中添加路径
  1. path("home/", views.home,name='home'), #主页面
复制代码
1.3 在视图中(view.py)添加如下代码
  1. from .models import ProductSample #导入表
  2. from django.utils.safestring import mark_safe
  3. """
  4. 需要修改如下代码(替换为自己的表):
  5. #数据总条数
  6. total_count = 替换.objects.all().order_by('id').count()
  7. #MySQL上获取数据
  8. documents = 替换.objects.all().order_by('id')[start:end]  # 指定按 id 字段排序
  9. """
  10. def home(request):
  11.     """主页面"""
  12.     # 分页器设计
  13.     page = int(request.GET.get('page',1))
  14.     size = 10    #每页显示10条
  15.     start = (page - 1)*size
  16.     end = page*size
  17.     #数据总条数
  18.     total_count = ProductSample.objects.all().order_by('id').count()
  19.     #总页码
  20.     total_page_count, div = divmod(total_count, size)
  21.     if div:
  22.         total_page_count +=1
  23.     #MySQL上获取数据
  24.     documents = ProductSample.objects.all().order_by('id')[start:end]  # 指定按 id 字段排序
  25.     #计算初当前页的前五页和后五页
  26.     plus = 5
  27.     if total_page_count <= 2 * plus + 1:
  28.         #数据库中的数据较少,没有达到11页
  29.         start_page = 1
  30.         end_page = total_page_count
  31.     else:
  32.         #数据库中的数据较多 大于11页
  33.         #当前页<5时
  34.         if page <= plus:
  35.             start_page = 1
  36.             end_page = 2 * plus
  37.         else:
  38.             #当前页>5
  39.             #当前页+5总页码
  40.             if (page + plus ) > total_page_count:
  41.                 start_page = total_page_count - 2 * plus
  42.                 end_page = total_page_count
  43.             else:
  44.                 start_page = page - plus
  45.                 end_page = page + plus
  46.     #页码
  47.     page_str_list = []
  48.     #首页
  49.     page_str_list.append('<li><a target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" href ="?page={}">首页</a></li>'.format(1))
  50.     #上一页
  51.     if page > 1:
  52.         prev = '<li><a target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" href ="?page={}" aria-label="Previous">«</a></li>'.format(page-1)
  53.     else:
  54.         prev = '<li><a target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" href ="?page={}" aria-label="Previous">«</a></li>'.format(1)
  55.     page_str_list.append(prev)
  56.     #页面
  57.     for i in range(start_page,end_page+1):
  58.         if i== page:
  59.             ele = '<li ><a target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" href ="?page={}">{}</a></li>'.format(i,i)
  60.         else:
  61.             ele = '<li><a target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" href ="?page={}">{}</a></li>'.format(i,i)
  62.         page_str_list.append(ele)
  63.     #下一页
  64.     if page < total_page_count:
  65.         next_page = '<li><a target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" href ="?page={}" aria-label="Next">»</a></li>'.format(page+1)
  66.     else:
  67.         next_page = '<li><a target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" href ="?page={}" aria-label="Next">»</a></li>'.format(total_page_count)
  68.     page_str_list.append(next_page)
  69.     #尾页
  70.     page_str_list.append('<li><a target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" href ="?page={}">尾页</a></li>'.format(total_page_count))
  71.     #搜索
  72.     search_string ="""
  73.     <li>
  74.             <form  method="get">
  75.                
  76.                     <input name="page"
  77.                            
  78.                            type="text"  placeholder="页码">
  79.                     
  80.             <button   type="submit">跳转</button>
  81.         
  82.                
  83.             </form>
  84.     </li>
  85.     """
  86.     page_str_list.append(search_string)
  87.     page_string = mark_safe("".join(page_str_list))
  88.     return render(request,'home/home.html',locals())
复制代码
1.4 html页面使用分页器
  1. {% for d in documents %}
  2. {{ d.pict_url }}
  3. {{ d.title }}
  4. <p>价格:${{ random_num }}</p>
  5. {% endfor %}
  6.   <nav aria-label="Page navigation">
  7.      <ul >
  8.          {{ page_string }}
  9.       </ul>
  10.   </nav>
  11. {% endblock %}
复制代码
2 高级版(设置组件,可用于其他数据的分页)

2.1 自定义分页组件(在app里面新建一个utils目录,在utils里面新建一个pagination.py文件)将下面代码添加到pagination.py文件中,使用说明如下:

缺点:搜索+分页器时,不能将搜索的情况保留(下面有改进版,按需设计)
  1. """
  2. 自定义的分页组件,以后想要使用这个分页组件,需要做如下几件事:
  3. #在视图函数中:
  4. from home.utils.pagination import Pagination
  5. def home(request):
  6.     # 1.根据自己的情况去筛选自己的数据
  7.     queryset = ProductSample.objects.all()
  8.     # 2.实例化分页对象
  9.     page_object = Pagination(request,queryset)
  10.     page_queryset = page_object.page_queryset  #分页后的数据
  11.     page_string = page_object.html()  #页码
  12.     return render(request,'home/home.html',locals())
  13.    
  14. #在HTML页面中:
  15.     {% for d in page_queryset %}
  16.         <h4> {{ d.title }} </h4>
  17.     {% endfor %}
  18.     <ul >
  19.         {{ page_string }}
  20.     </ul>
  21. """
  22. from django.utils.safestring import mark_safe
  23. class Pagination(object):
  24.     def __init__(self,request,queryset,size = 10, plus=5, page_param="page"):
  25.         """
  26.         :param request: 请求的对象
  27.         :param queryset: 符合条件的数据(对该数据进行分页处理)
  28.         :param size:每页显示多少条数据
  29.         :param plus:显示当前页的前或后几页(页码)
  30.         :param page_param:在URL中传递的获取分页的参数,例如:/home/?page=12
  31.         """
  32.         page = request.GET.get(page_param, "1")
  33.         if page.isdecimal():
  34.             page = int(page)
  35.         else:
  36.             page = 1
  37.         self.page = page
  38.         self.size = size  # 每页显示10条
  39.         self.start = (page - 1) * size
  40.         self.end = page * size
  41.         self.page_queryset =queryset[self.start:self.end]
  42.         # 数据总条数
  43.         total_count = queryset.count()
  44.         # 总页码
  45.         total_page_count, div = divmod(total_count, size)
  46.         if div:
  47.             total_page_count += 1
  48.         self.total_page_count = total_page_count
  49.         self.plus = plus
  50.     def html(self):
  51.         # 计算初当前页的前五页和后五页
  52.         if self.total_page_count <= 2 * self.plus + 1:
  53.             # 数据库中的数据较少,没有达到11页
  54.             start_page = 1
  55.             end_page = self.total_page_count
  56.         else:
  57.             # 数据库中的数据较多 大于11页
  58.             # 当前页<5时
  59.             if self.page <= self.plus:
  60.                 start_page = 1
  61.                 end_page = 2 * self.plus
  62.             else:
  63.                 # 当前页>5
  64.                 # 当前页+5总页码
  65.                 if (self.page + self.plus) > self.total_page_count:
  66.                     start_page = self.total_page_count - 2 * self.plus
  67.                     end_page = self.total_page_count
  68.                 else:
  69.                     start_page = self.page - self.plus
  70.                     end_page = self.page + self.plus
  71.         # 页码
  72.         page_str_list = []
  73.         # 首页
  74.         page_str_list.append('<li><a target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" href ="?page={}">首页</a></li>'.format(1))
  75.         # 上一页
  76.         if self.page > 1:
  77.             prev = '<li><a target="_blank" href ="/home/?page={}" aria-label="Previous">«</a></li>'.format(
  78.                 self.page - 1)
  79.         else:
  80.             prev = '<li><a target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" href ="?page={}" aria-label="Previous">«</a></li>'.format(
  81.                 1)
  82.         page_str_list.append(prev)
  83.         # 页面
  84.         for i in range(start_page, end_page + 1):
  85.             if i == self.page:
  86.                 ele = '<li ><a target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" href ="?page={}">{}</a></li>'.format(i, i)
  87.             else:
  88.                 ele = '<li><a target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" href ="?page={}">{}</a></li>'.format(i, i)
  89.             page_str_list.append(ele)
  90.         # 下一页
  91.         if self.page < self.total_page_count:
  92.             next_page = '<li><a target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" href ="?page={}" aria-label="Next">»</a></li>'.format(
  93.                 self.page + 1)
  94.         else:
  95.             next_page = '<li><a target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" href ="?page={}" aria-label="Next">»</a></li>'.format(
  96.                 self.total_page_count)
  97.         page_str_list.append(next_page)
  98.         # 尾页
  99.         page_str_list.append('<li><a target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" href ="?page={}">尾页</a></li>'.format(self.total_page_count))
  100.         # 搜索
  101.         search_string = """
  102.             <li>
  103.                     <form  method="get">
  104.                         
  105.                             <input name="page"
  106.                                    
  107.                                    type="text"  placeholder="页码">
  108.                            
  109.                     <button   type="submit">跳转</button>
  110.                
  111.                         
  112.                     </form>
  113.             </li>
  114.             """
  115.         page_str_list.append(search_string)
  116.         page_string = mark_safe("".join(page_str_list))
  117.         return page_string
复制代码
3 高级版的升级(搜索+分页)

修改pagination.py文件。原理:保留参数
问题:跳转不能实现搜索的跳转,处理办法,结合Ajax来实现。
  1. """
  2. 自定义的分页组件,以后想要使用这个分页组件,需要做如下几件事:
  3. 在视图函数中:
  4. from home.utils.pagination import Pagination
  5. def home(request):
  6.     # 1.根据自己的情况去筛选自己的数据
  7.     queryset = ProductSample.objects.all()
  8.     # 2.实例化分页对象
  9.     page_object = Pagination(request,queryset)
  10.     page_queryset = page_object.page_queryset  #分页后的数据
  11.     page_string = page_object.html()  #页码
  12.     return render(request,'home/home.html',locals())
  13.    
  14.     #在HTML页面中:
  15.     {% for d in page_queryset %}
  16.         <h4> {{ d.title }} </h4>
  17.     {% endfor %}
  18.     <ul >
  19.         {{ page_string }}
  20.     </ul>
  21. """
  22. from django.utils.safestring import mark_safe
  23. class Pagination(object):
  24.     def __init__(self,request,queryset,size = 10, plus=5, page_param="page"):
  25.         """
  26.         :param request: 请求的对象
  27.         :param queryset: 符合条件的数据(对该数据进行分页处理)
  28.         :param size:每页显示多少条数据
  29.         :param plus:显示当前页的前或后几页(页码)
  30.         :param page_param:在URL中传递的获取分页的参数,例如:/home/?page=12
  31.         """
  32.         from  django.http.request import QueryDict
  33.         import copy
  34.         query_dict = copy.deepcopy(request.GET)
  35.         query_dict._mutable = True
  36.         self.query_dict = query_dict
  37.         self.page_param = page_param
  38.         page = request.GET.get(page_param, "1")
  39.         if page.isdecimal():
  40.             page = int(page)
  41.         else:
  42.             page = 1
  43.         self.page = page
  44.         self.size = size  # 每页显示10条
  45.         self.start = (page - 1) * size
  46.         self.end = page * size
  47.         self.page_queryset =queryset[self.start:self.end]
  48.         # 数据总条数
  49.         total_count = queryset.count()
  50.         # 总页码
  51.         total_page_count, div = divmod(total_count, size)
  52.         if div:
  53.             total_page_count += 1
  54.         self.total_page_count = total_page_count
  55.         self.plus = plus
  56.     def html(self):
  57.         # 计算初当前页的前五页和后五页
  58.         if self.total_page_count <= 2 * self.plus + 1:
  59.             # 数据库中的数据较少,没有达到11页
  60.             start_page = 1
  61.             end_page = self.total_page_count
  62.         else:
  63.             # 数据库中的数据较多 大于11页
  64.             # 当前页<5时
  65.             if self.page <= self.plus:
  66.                 start_page = 1
  67.                 end_page = 2 * self.plus
  68.             else:
  69.                 # 当前页>5
  70.                 # 当前页+5总页码
  71.                 if (self.page + self.plus) > self.total_page_count:
  72.                     start_page = self.total_page_count - 2 * self.plus
  73.                     end_page = self.total_page_count
  74.                 else:
  75.                     start_page = self.page - self.plus
  76.                     end_page = self.page + self.plus
  77.         # 页码
  78.         page_str_list = []
  79.         self.query_dict.setlist(self.page_param,[1])
  80.         # 首页
  81.         page_str_list.append('<li><a target="_blank" target="_blank" target="_blank" target="_blank" href ="?{}">首页</a></li>'.format(self.query_dict.urlencode()))
  82.         # 上一页
  83.         if self.page > 1:
  84.             self.query_dict.setlist(self.page_param, [self.page - 1])
  85.             prev = '<li><a target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" href ="?{}" aria-label="Previous">«</a></li>'.format(
  86.                 self.query_dict.urlencode())
  87.         else:
  88.             self.query_dict.setlist(self.page_param, [1])
  89.             prev = '<li><a target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" href ="?{}" aria-label="Previous">«</a></li>'.format(
  90.                 self.query_dict.urlencode())
  91.         page_str_list.append(prev)
  92.         # 页面
  93.         for i in range(start_page, end_page + 1):
  94.             if i == self.page:
  95.                 self.query_dict.setlist(self.page_param, [i])
  96.                 ele = '<li ><a target="_blank" target="_blank" target="_blank" target="_blank" href ="?{}">{}</a></li>'.format(self.query_dict.urlencode(), i)
  97.             else:
  98.                 self.query_dict.setlist(self.page_param, [i])
  99.                 ele = '<li><a target="_blank" target="_blank" target="_blank" target="_blank" href ="?{}">{}</a></li>'.format(self.query_dict.urlencode(), i)
  100.             page_str_list.append(ele)
  101.         # 下一页
  102.         if self.page < self.total_page_count:
  103.             self.query_dict.setlist(self.page_param, [self.page + 1])
  104.             next_page = '<li><a target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" href ="?{}" aria-label="Next">»</a></li>'.format(
  105.                 self.query_dict.urlencode())
  106.         else:
  107.             self.query_dict.setlist(self.page_param, [self.total_page_count])
  108.             next_page = '<li><a target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" target="_blank" href ="?{}" aria-label="Next">»</a></li>'.format(
  109.                 self.query_dict.urlencode())
  110.         page_str_list.append(next_page)
  111.         # 尾页
  112.         self.query_dict.setlist(self.page_param, [self.total_page_count])
  113.         page_str_list.append('<li><a target="_blank" target="_blank" target="_blank" target="_blank" href ="?{}">尾页</a></li>'.format(self.query_dict.urlencode()))
  114.         # 搜索
  115.         search_string = """
  116.             <li>
  117.                     <form  method="get">
  118.                         
  119.                             <input name="page"
  120.                                    
  121.                                    type="text"  placeholder="页码">
  122.                            
  123.                     <button   type="submit">跳转</button>
  124.                
  125.                         
  126.                     </form>
  127.             </li>
  128.             """
  129.         page_str_list.append(search_string)
  130.         page_string = mark_safe("".join(page_str_list))
  131.         return page_string
复制代码
来源:https://www.cnblogs.com/Pluto-Love-Learn/p/18088226
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具