Paginator 分页功能
Django原生分页
HTML代码:

//数据获取 {% for host in page_obj %} <tr> <td>{{ forloop.counter }}</td> <td target="host_id" style="display: none">{{ host.id }}</td> <td target="host_name">{{ host.hostname }}</td> <td target="host_address">{{ host.address }}</td> <td>{{ host.business }}</td> <td class="col-md-3"> <button class="btn btn-primary host-edit" data-toggle="modal" data-target="#EditModal"><i class="fa fa-edit"></i>Edit</button> <a href="{% url "host_edit" host.id %}" class="btn btn-default"><i class=" fa fa-refresh "></i>Edit</a> <a href="{% url "host_delete" host.id %}" class="btn btn-danger"><i class="fa fa-pencil"></i>Delete</a> </td> </tr> {% endfor %} //分页 <div class="paginator col-md-offset-6"> {% if page_obj.has_previous %} <a href="?p={{ page_obj.previous_page_number }}">上一页</a> {% else %} 没有上一页 {% endif %} {% for i in page_obj.paginator.page_range %} <a href="?p={{ i }}">{{ i }}</a> {% endfor %} {% if page_obj.has_next %} <a href="?p={{ page_obj.next_page_number }}">下一页</a> {% else %} 没有下一页 {% endif %} </div>
第三方库分页功能
django-pure-pagination库: https://github.com/jamespacileo/django-pure-pagination
第一步: pip install django-pure-pagination
第二步: INSTALLED_APPS = ( ... 'pure_pagination', )
第三步: 编写views.py
第四步: 编写html
View代码:

from pure_pagination import Paginator, EmptyPage, PageNotAnInteger class BookListView(View): """ 图书列表 """ def get(self, request): current_category = request.GET.get('category') all_category = BookDict.objects.all() all_books = Book.objects.all() # 分类显示功能 category_id = request.GET.get("category", "") if category_id: all_books = all_books.filter(category_id=int(category_id)) # 分页功能 try: page = request.GET.get("page", 1) except PageNotAnInteger: page = 1 p = Paginator(all_books, 10, request=request) all_books = p.page(page) return render(request, "book_list.html", { "book_category": all_category, "all_books": all_books, "current_category": current_category })
html代码:

<ul class="pager"> {% if all_books.has_previous %} <li class="long"><a href="?{{ all_books.previous_page_number.querystring }}">上一页</a></li> {% endif %} {% for page in all_books.pages %} {% if page %} {% ifequal page all_books.number %} <li class="active"><a href="?{{ page.querystring }}">{{ page }}</a></li> {% else %} <li><a href="?{{ page.querystring }}" class="pager">{{ page }}</a></li> {% endifequal %} {% else %} <li class="none"><a href="">...</a></li> {% endif %} {% endfor %} {% if all_books.has_next %} <li class="long"><a href="?{{ all_books.next_page_number.querystring }}">下一页</a></li> {% endif %} </ul>
自定义分页功能
自定义pagenator类

""" 使用方法: all_count = Models.objects.all().count() paginator = Paginator(request.GET.get("p"), 10, all_count, request.path_info) queryset = Models.objects.all()[paginator.start: paginator.end] """ class Paginator(object): def __init__(self, current_page, per_page_number, all_data_count, base_url, page_range=5): """ :param current_page: 当前页 :param per_page_number: 每页显示的数据条数 :param all_data_count: 数据库中数据的总条数 :param base_url: 页面的前缀 :param page_range: 页码的显示范围 """ try: current_page = int(current_page) except Exception: current_page = 1 self.current_page = current_page self.per_page_number = per_page_number self.all_data_count = all_data_count self.base_url = base_url self.page_range = page_range a, b = divmod(all_data_count, per_page_number) if b == 0: self.all_page = a else: self.all_page = a + 1 @property def start(self): return (self.current_page - 1) * self.per_page_number @property def end(self): return self.current_page * self.per_page_number def page_str(self): """ 在HTML页面中显示页码标签 :return: """ page_html = [] # 上一页逻辑 if self.current_page <= 1: prev = '<li><a href="#">首页</a></li>' else: prev = '<li><a href="%s?p=%s">上一页</a></li>' % (self.base_url, self.current_page - 1) page_html.append(prev) # 页码逻辑 if self.all_page <= self.page_range: start = 1 end = self.all_page + 1 else: if self.current_page > int(self.page_range / 2): if (self.current_page + int(self.page_range / 2)) > self.all_page: start = self.all_page - self.page_range + 1 end = self.all_page + 1 else: start = self.current_page - int(self.page_range / 2) end = self.current_page + int(self.page_range / 2) + 1 else: start = 1 end = self.page_range + 1 for i in range(start, end): if self.current_page == i: page_number = '<li class="active"><a href="%s?p=%s">%s</a></li>' % (self.base_url, i, i) else: page_number = '<li><a href="%s?p=%s">%s</a></li>' % (self.base_url, i, i) page_html.append(page_number) # 下一页逻辑 if self.current_page >= self.all_page: nex = '<li><a href="#">尾页</a></li>' else: nex = '<li><a href="%s?p=%s">下一页</a></li>' %(self.base_url, self.current_page + 1) page_html.append(nex) return " ".join(page_html)
html代码

<!-- //页码部分--> <div class="col-md-offset-4"> <ul class="pagination"> {{ paginator.page_str|safe }} </ul> </div>