首页 > 编程 > Python > 正文

Django框架 Pagination分页实现代码实例

2019-11-25 11:46:26
字体:
来源:转载
供稿:网友

一、自定义分页

1、基础版自定义分页

data = [] for i in range(1, 302):  tmp = {"id": i, "name": "alex-{}".format(i)}  data.append(tmp) print(data)def user_list(request):   # user_list = data[0:10]  # user_list = data[10:20]  try:    current_page = int(request.GET.get("page"))  except Exception as e:    current_page = 1   per_page = 10   # 数据总条数  total_count = len(data)  # 总页码  total_page, more = divmod(total_count, per_page)  if more:    total_page += 1   # 页面最多显示多少个页码  max_show = 11  half_show = int((max_show-1)/2)   if current_page <= half_show:    show_start = 1    show_end = max_show  else:    if current_page + half_show >= total_page:      show_start = total_page - max_show      show_end = total_page    else:      show_start = current_page - half_show      show_end = current_page + half_show   # 数据库中获取数据  data_start = (current_page - 1) * per_page  data_end = current_page * per_page   user_list = data[data_start:data_end]   # 生成页面上显示的页码  page_html_list = []  # 加首页  first_li = '<li><a href="/user_list/?page=1" rel="external nofollow" >首页</a></li>'  page_html_list.append(first_li)  # 加上一页  if current_page == 1:    prev_li = '<li><a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >上一页</a></li>'  else:    prev_li = '<li><a href="/user_list/?page={}" rel="external nofollow" rel="external nofollow" rel="external nofollow" >上一页</a></li>'.format(current_page - 1)  page_html_list.append(prev_li)  for i in range(show_start, show_end+1):    if i == current_page:      li_tag = '<li class="active"><a href="/user_list/?page={0}" rel="external nofollow" rel="external nofollow" >{0}</a></li>'.format(i)    else:      li_tag = '<li><a href="/user_list/?page={0}" rel="external nofollow" rel="external nofollow" >{0}</a></li>'.format(i)    page_html_list.append(li_tag)   # 加下一页  if current_page == total_page:    next_li = '<li><a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >下一页</a></li>'  else:    next_li = '<li><a href="/user_list/?page={}" rel="external nofollow" rel="external nofollow" rel="external nofollow" >下一页</a></li>'.format(current_page+1)  page_html_list.append(next_li)   # 加尾页  page_end_li = '<li><a href="/user_list/?page={}" rel="external nofollow" rel="external nofollow" rel="external nofollow" >尾页</a></li>'.format(total_page)  page_html_list.append(page_end_li)   page_html = "".join(page_html_list)   return render(request, "user_list.html", {"user_list": user_list, "page_html": page_html})

2、封装保存版

class Pagination(object):  def __init__(self, current_page, total_count, base_url, per_page=10, max_show=11):    """    :param current_page: 当前页    :param total_count: 数据库中数据总数    :param per_page: 每页显示多少条数据    :param max_show: 最多显示多少页    """    try:      current_page = int(current_page)    except Exception as e:      current_page = 1     self.current_page = current_page    self.total_count = total_count    self.base_url = base_url    self.per_page = per_page    self.max_show = max_show     # 总页码    total_page, more = divmod(total_count, per_page)    if more:      total_page += 1         half_show = int((max_show - 1) / 2)    self.half_show = half_show    self.total_page = total_page   @property  def start(self):    return (self.current_page - 1) * self.per_page   @property  def end(self):    return self.current_page * self.per_page   def page_html(self):     if self.current_page <= self.half_show:      show_start = 1      show_end = self.max_show    else:      if self.current_page + self.half_show >= self.total_page:        show_start = self.total_page - self.max_show        show_end = self.total_page      else:        show_start = self.current_page - self.half_show        show_end = self.current_page + self.half_show         # 生成页面上显示的页码    page_html_list = []    # 加首页    first_li = '<li><a href="{}?page=1" rel="external nofollow" >首页</a></li>'.format(self.base_url)    page_html_list.append(first_li)    # 加上一页    if self.current_page == 1:      prev_li = '<li><a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >上一页</a></li>'    else:      prev_li = '<li><a href="{0}?page={1}" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >上一页</a></li>'.format(self.base_url, self.current_page - 1)    page_html_list.append(prev_li)    for i in range(show_start, show_end + 1):      if i == self.current_page:        li_tag = '<li class="active"><a href="{0}?page={1}" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >{1}</a></li>'.format(self.base_url, i)      else:        li_tag = '<li><a href="{0}?page={1}" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >{1}</a></li>'.format(self.base_url, i)      page_html_list.append(li_tag)     # 加下一页    if self.current_page == self.total_page:      next_li = '<li><a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >下一页</a></li>'    else:      next_li = '<li><a href="{0}?page={1}" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >下一页</a></li>'.format(self.base_url, self.current_page + 1)    page_html_list.append(next_li)     # 加尾页    page_end_li = '<li><a href="{0}?page={1}" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >尾页</a></li>'.format(self.base_url, self.total_page)    page_html_list.append(page_end_li)     return "".join(page_html_list)

3、封装保存版使用指南

def user_list(request):  pager = Pagination(request.GET.get("page"), len(data), request.path_info)  user_list = data[pager.start:pager.end]  page_html = pager.page_html()  return render(request, "user_list.html", {"user_list": user_list, "page_html": page_html})

二、Django内置分页

1、内置分页view部分

from django.shortcuts import renderfrom django.core.paginator import Paginator, EmptyPage, PageNotAnIntegerL = []for i in range(999):  L.append(i)def index(request):  current_page = request.GET.get('p')  paginator = Paginator(L, 10)  # per_page: 每页显示条目数量  # count:  数据总个数  # num_pages:总页数  # page_range:总页数的索引范围,如: (1,10),(1,200)  # page:   page对象  try:    posts = paginator.page(current_page)    # has_next       是否有下一页    # next_page_number   下一页页码    # has_previous     是否有上一页    # previous_page_number 上一页页码    # object_list      分页之后的数据列表    # number        当前页    # paginator       paginator对象  except PageNotAnInteger:    posts = paginator.page(1)  except EmptyPage:    posts = paginator.page(paginator.num_pages)  return render(request, 'index.html', {'posts': posts}) 

2、内置分页HTML部分

<!DOCTYPE html><html><head lang="en">  <meta charset="UTF-8">  <title></title></head><body><ul>  {% for item in posts %}    <li>{{ item }}</li>  {% endfor %}</ul> <div class="pagination">   <span class="step-links">    {% if posts.has_previous %}      <a href="?p={{ posts.previous_page_number }}" rel="external nofollow" >Previous</a>    {% endif %}     <span class="current">      Page {{ posts.number }} of {{ posts.paginator.num_pages }}.     </span>     {% if posts.has_next %}       <a href="?p={{ posts.next_page_number }}" rel="external nofollow" >Next</a>     {% endif %}   </span></div></body></html>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持武林网。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表