| """ |
| 分页组件应用: |
| 1. 在视图函数中 |
| queryset = models.Issues.objects.filter(project_id=project_id) |
| page_object = Pagination( |
| current_page=request.GET.get('page'), |
| all_count=queryset.count(), |
| base_url=request.path_info, |
| query_params=request.GET |
| ) |
| issues_object_list = queryset[page_object.start:page_object.end] |
| |
| context = { |
| 'issues_object_list': issues_object_list, |
| 'page_html': page_object.page_html() |
| } |
| return render(request, 'issues.html', context) |
| 2. 前端 |
| {% for item in issues_object_list %} |
| {{item.xxx}} |
| {% endfor %} |
| |
| <nav aria-label="..."> |
| <ul class="pagination" style="margin-top: 0;"> |
| {{ page_html|safe }} |
| </ul> |
| </nav> |
| """ |
| |
| |
| class Pagination(object): |
| def __init__(self, current_page, all_count, base_url, query_params, per_page=30, pager_page_count=11): |
| """ |
| 分页初始化 |
| :param current_page: 当前页码 |
| :param per_page: 每页显示数据条数 |
| :param all_count: 数据库中总条数 |
| :param base_url: 基础URL |
| :param query_params: QueryDict对象,内部含所有当前URL的原条件 |
| :param pager_page_count: 页面上最多显示的页码数量 |
| """ |
| self.base_url = base_url |
| try: |
| self.current_page = int(current_page) |
| if self.current_page <= 0: |
| self.current_page = 1 |
| except Exception as e: |
| self.current_page = 1 |
| query_params = query_params.copy() |
| query_params._mutable = True |
| self.query_params = query_params |
| self.per_page = per_page |
| self.all_count = all_count |
| self.pager_page_count = pager_page_count |
| pager_count, b = divmod(all_count, per_page) |
| if b != 0: |
| pager_count += 1 |
| self.pager_count = pager_count |
| |
| half_pager_page_count = int(pager_page_count / 2) |
| self.half_pager_page_count = half_pager_page_count |
| |
| @property |
| def start(self): |
| """ |
| 数据获取值起始索引 |
| :return: |
| """ |
| return (self.current_page - 1) * self.per_page |
| |
| @property |
| def end(self): |
| """ |
| 数据获取值结束索引 |
| :return: |
| """ |
| return self.current_page * self.per_page |
| |
| def page_html(self): |
| """ |
| 生成HTML页码 |
| :return: |
| """ |
| if self.all_count == 0: |
| return "" |
| |
| |
| if self.pager_count < self.pager_page_count: |
| pager_start = 1 |
| pager_end = self.pager_count |
| else: |
| |
| |
| if self.current_page <= self.half_pager_page_count: |
| pager_start = 1 |
| pager_end = self.pager_page_count |
| else: |
| |
| if (self.current_page + self.half_pager_page_count) > self.pager_count: |
| pager_end = self.pager_count |
| pager_start = self.pager_count - self.pager_page_count + 1 |
| else: |
| pager_start = self.current_page - self.half_pager_page_count |
| pager_end = self.current_page + self.half_pager_page_count |
| |
| page_list = [] |
| |
| if self.current_page <= 1: |
| prev = '<li><a href="#">上一页</a></li>' |
| else: |
| self.query_params['page'] = self.current_page - 1 |
| prev = '<li><a href="%s?%s">上一页</a></li>' % (self.base_url, self.query_params.urlencode()) |
| page_list.append(prev) |
| for i in range(pager_start, pager_end + 1): |
| self.query_params['page'] = i |
| if self.current_page == i: |
| tpl = '<li class="active"><a href="%s?%s">%s</a></li>' % ( |
| self.base_url, self.query_params.urlencode(), i,) |
| else: |
| tpl = '<li><a href="%s?%s">%s</a></li>' % (self.base_url, self.query_params.urlencode(), i,) |
| page_list.append(tpl) |
| |
| if self.current_page >= self.pager_count: |
| nex = '<li><a href="#">下一页</a></li>' |
| else: |
| self.query_params['page'] = self.current_page + 1 |
| nex = '<li><a href="%s?%s">下一页</a></li>' % (self.base_url, self.query_params.urlencode(),) |
| page_list.append(nex) |
| |
| if self.all_count: |
| tpl = "<li class='disabled'><a>共%s条数据,页码%s/%s页</a></li>" % ( |
| self.all_count, self.current_page, self.pager_count,) |
| page_list.append(tpl) |
| page_str = "".join(page_list) |
| return page_str |
| |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!