py code...
from django.core.paginator import Paginator class NewsListView(View): def get(self, request): '''分页''' page = int(request.GET.get('page', 1)) # 第多少页,默认1 print(page) newses = News.objects.select_related("category", "author").all() categories = NewsCategory.objects.all() p = Paginator(newses, 5) # 每页显示n条数据 page_obj = p.page(page) # 第n页的 page对象 <Page 1 of n> current_page_newses = page_obj.object_list # not func!! 当前页的newes所有数据 设置的是显示一条data context = { 'newses': page_obj.object_list, 'categories': categories, 'p': p, 'current_page': page } context.update(self.get_paging_data(p , page_obj, show_pages=2, page=page)) return render(request, 'cms/news_list.html', context=context) def get_paging_data(self, paginator, page_obj, show_pages,page=None): """ 分页当前页的左右范围 :param paginator: Paginator(obj, number)对象 :param page_obj: # 第n页的 page对象 <Page 1 of n> page_obj.number获取当前页 :param show_pages: 当前页左右展示的页数 :param page: 当前页 ps:可选参数 :return: 当前页左右显示的页数range对象 和 has_left(right)_more Bool值,用来判断是否显示 分页的省略号 ... """ current_page = page_obj.number show_pages = show_pages pages_number = paginator.num_pages has_left_more = False has_right_more = False # 左边的逻辑判断 print(current_page, 'c') if current_page <= show_pages + 2: left_start = 1 left_end = current_page else: has_left_more = True left_start = current_page - show_pages left_end = current_page left_range = range(left_start, left_end) # 右边的逻辑判断(在右边包括了当前页) if current_page >= pages_number - show_pages - 1: right_start = current_page right_end = pages_number + 1 else: has_right_more = True right_start = current_page right_end = current_page + show_pages + 1 right_range = range(right_start, right_end) data = { 'left_range': left_range, 'right_range': right_range, 'has_left_more': has_left_more, 'has_right_more': has_right_more, 'current_page': current_page, } print(left_range, has_left_more) return data
html code
<link rel="stylesheet" href="{% static 'adminlte/bower_components/bootstrap/dist/css/bootstrap.min.css' %}"> <link rel="stylesheet" href="{% static 'adminlte/bower_components/font-awesome/css/font-awesome.min.css' %}"> <link rel="stylesheet" href="{% static 'adminlte/dist/css/AdminLTE.min.css' %}"> <link rel="stylesheet" href="{% static 'adminlte/dist/css/skins/_all-skins.min.css' %}"> <link rel="stylesheet" href="{% static 'sweetalert/sweetalert.css' %}"> <script src="{% static 'adminlte/bower_components/jquery/dist/jquery.min.js' %}"></script> <script src="{% static 'adminlte/bower_components/bootstrap/dist/js/bootstrap.min.js' %}"></script> <script src="{% static 'adminlte/dist/js/adminlte.min.js' %}"></script> <script src="{% static 'sweetalert/sweetalert.min.js' %}"></script> <script src="{% static 'sweetalert/xfzalert.js' %}"></script> <script src="{% static 'js/xfzajax.js' %}"></script> <script src="{% static 'js/message.js' %}"></script>
{% block content %} <div class="box"> <div class="box-header"> <form class="form-inline"> <div class="form-group"> <div class="pull-left margins"> <label for="start-input">时间:</label> <input readonly class="form-control" type="text" id="start-input" placeholder="开始时间"> <span>-</span> <input readonly class="form-control" type="text" placeholder="结束时间"> </div> </div> <div class="form-group margins"> <label for="title-input">标题:</label> <input class="form-control" type="text" id="title-input" placeholder="关键字"> </div> <div class="form-group margins"> <label for="">分类:</label> <select class="form-control" name="" id="category-input"> {% for category in categories %} <option value="">{{ category.name }}</option> {% endfor %} </select> </div> <div class="form-group margins"> <button class="btn btn-primary btn-sm clear-btn">查询</button> </div> <div class="form-group margins"> <a href="{% url 'cms:news_list' %}" class="btn btn-info btn-sm">清除查询</a> </div> </form> </div> <div class="box-body"> <table class="table table-bordered"> <thead> <tr> <th>标题</th> <th>分类</th> <th>发布时间</th> <th>作者</th> <th>操作</th> </tr> </thead> <tbody> {% for news in newses %} <tr> <td> <a href="{% url 'news:news_detail' news_id=news.pk %}">{{ news.title }}</a> </td> <td>{{ news.category.name }}</td> <td>{{ news.pubtime | cms_date_filter }}</td> <td>{{ news.author.username }}</td> <td> <button class="btn btn-warning btn-xs">编辑</button> <button class="btn btn-danger btn-xs">删除</button> </td> </tr> {% endfor %} </tbody> </table> </div> <div class="box-footer"> <span class="pull-left">第{{ current_page }}页/共{{ p.num_pages }}页</span> <nav aria-label="Page navigation" class="pull-right"> <ul class="pagination"> {# 前一页 #} {% if page_obj.has_previous %} <li> <a href="?page={{ page_obj.previous_page_number }}" aria-label="Previous"> <span aria-hidden="true">«</span> </a> </li> {% else %} <li class="disabled"> <span aria-hidden="true">«</span> </li> {% endif %} {# 当前页左边部分 #} {% if has_left_more %} <li><a href="?page=1">1</a></li> <li><span>...</span></li> {% for page in left_range %} <li><a href="?page={{ page }}">{{ page }}</a></li> {% endfor %} {% else %} {% for page in left_range %} <li><a href="?page={{ page }}">{{ page }}</a></li> {% endfor %} {% endif %} {# 当前页右边部分 ,包括了当前页 #} {% if has_right_more %} {% for page in right_range %} <li><a href="?page={{ page }}">{{ page }}</a></li> {% endfor %} <li><span>...</span></li> <li><a href="?page={{ p.num_pages }}">{{ p.num_pages }}</a></li> {% else %} {% for page in right_range %} <li><a href="?page={{ page }}">{{ page }}</a></li> {% endfor %} {% endif %} {# 后一页 #} {% if page_obj.has_next %} <li> <a href="?page={{ page_obj.next_page_number }}" aria-label="Next" class="disabled"> <span aria-hidden="true">»</span> </a> </li> {% else %} <li class="disabled"> <span aria-hidden="true">»</span> </li> {% endif %} </ul> </nav> </div> </div> {% endblock %}