Python--django实现分页功能

1.html测试数据

{% extends 'crm_/main_table.html' %}
{% block css %}
    <style>
        th {
            text-align: center;
        }
    </style>
{% endblock %}
{% block table_ %}
    <div class="col-sm-9 col-sm-offset-3 col-md-10 col-md-offset-2 main">
        <div class="table-responsive text-center">
            <table class="table table-striped table-hover table-bordered main">
                <thead>
                <tr>
                    <th>#</th>
                    <th>称号</th>
                </tr>
                </thead>
                <tbody>
                {% for l in ls %}
                    <tr>
                        <td>{{ forloop.counter }}</td>
                        <td>{{ l.name }}</td>
                        <td>{{ l.pwd }}</td>
                    </tr>
                {% endfor %}

                </tbody>
            </table>
        </div>


        <nav aria-label="Page navigation">
            <ul class="pagination">
                {{ st_pr }}
                {{ pads }}
                {{ st_en }}
            </ul>
        </nav>
    </div>


{% endblock %}

2.封装的分页功能

'''
分页器
'''
from django.utils.safestring import mark_safe


class Pagination:
	def __init__(self, request, all_data, pag_data=10, max_pad=11):
		# 基本的URL
		self.base_url = request.path_info
		# 第一次返回时没有id或则是你输入的id不存在
		try:
			self.current_pad = int(request.GET.get('id'))
		except Exception as e:
			self.current_pad = 1
		ls = [{'name': 'alex{0}'.format(i), 'pwd': 'dsb{0}'.format(i)} for i in range(1, 302)]

		# 最多显示的分页个数
		self.max_pad = max_pad
		half_pad = self.max_pad // 2

		# 定义你想要显示的数据
		self.pag_data = pag_data
		# 拿到总数据数
		self.all_data = all_data
		# 用divmod内置函数,取到你要分的页数
		self.pads, pad_y = divmod(self.all_data, self.pag_data)
		if pad_y:
			self.pads += 1

			# 定义分页的开始位置和结束位置
			if self.current_pad <= half_pad:
				self.start_pad = 1
				self.end_pad = self.max_pad
			elif self.current_pad >= self.pads - half_pad:
				self.start_pad = self.pads - self.max_pad + 1
				self.end_pad = self.pads + 1
			else:
				self.start_pad = self.current_pad - half_pad
				self.end_pad = self.current_pad + half_pad
			'''
				1   1   10
				2   10  20
				3   20  30
			'''
			# 如果你的总页数小于你定义最大显示,改变它的开始和结束的位置
			if self.pads <= self.max_pad:
				self.start_pad = 1
				self.end_pad = self.pads + 1

	@property
	def StartPage(self):
		return (self.current_pad - 1) * 10

	@property
	def EndPage(self):
		return self.current_pad * 10

	def ActivePage(self):
		# 把前端代码拿过来,最后用""字符串拼接,然后再用mark_safe给标签过滤
		lst = []
		for i in range(self.start_pad, self.end_pad):
			if i == self.current_pad:
				st = '<li class="active"><a href="/pad/?id={0}">{0}</a></li>'.format(i)
			else:
				st = '<li><a href="/pad/?id={0}">{0}</a></li>'.format(i)
			lst.append(st)
		str_ls = mark_safe("".join(lst))
		return str_ls

	def PrePage(self):
		# 上一页
		if self.current_pad <= 1:
			st_pr = '<li class="disabled"><span aria-hidden="true">&laquo;</span></li>'
		else:
			st_pr = '<li><a href="/pad/?id={}" aria-label="Previous">' \
					'<span aria-hidden="true">&laquo;</span></a></li>'.format(
				self.current_pad - 1)
		st_pr = mark_safe(st_pr)
		return st_pr

	def NextPage(self):
		# 下一页
		if self.current_pad >= self.pads:
			st_en = '<li class="disabled"><span aria-hidden="true">&raquo;</span></li>'
		else:
			st_en = '<li><a href="/pad/?id={}" aria-label="Next"><span aria-hidden="true">&raquo;</span></a></li>'.format(
				self.current_pad + 1)
		st_en = mark_safe(st_en)
		return st_en

3.view文件中调用:

user = [{'name': 'alex{}'.format(i), 'pwd': 'alexdsb{}'.format(i)} for i in range(1, 302)]
def pad(request):
	obj = Pagination(request, len(user))
	return render(request, 'paddingex.html', {
		'ls': user[obj.StartPage:obj.EndPage],
		'pads': obj.ActivePage(),
		'st_pr': obj.PrePage(),
		'st_en': obj.NextPage()
	})

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Django实现前后端分离的分页功能模块可以通过以下步骤进行: 1. 后端实现: - 创建一个 Django 视图函数,用于处理分页请求。可以使用 Django 的内置分页器类 `Paginator` 来实现分页功能。 - 在视图函数中,获取前端传递过来的当前页码和每页显示的数量。可以通过 `request.GET` 获取 GET 请求中的参数。 - 使用 `Paginator` 类对数据进行分页,并获取当前页的数据。 - 将分页结果和当前页码等信息封装成 JSON 格式返回给前端。 2. 前端实现: - 在前端页面中,通过 AJAX 或者其他方式发送分页请求到后端视图函数。 - 在接收到后端返回的 JSON 数据后,解析数据并渲染到页面上,显示分页结果。 - 创建前端的分页组件,包括上一页、下一页、跳转等功能,以便用户进行翻页操作。 下面是一个简单的示例代码: 后端实现(views.py): ```python from django.core.paginator import Paginator from django.http import JsonResponse def get_paginated_data(request): data = ['item1', 'item2', 'item3', 'item4', 'item5', 'item6', 'item7', 'item8', 'item9', 'item10'] paginator = Paginator(data, 3) # 每页显示3条数据 page_number = request.GET.get('page') # 获取当前页码,默认为1 page_obj = paginator.get_page(page_number) current_page = page_obj.number total_pages = paginator.num_pages items = page_obj.object_list response_data = { 'current_page': current_page, 'total_pages': total_pages, 'items': items, } return JsonResponse(response_data) ``` 前端实现(JavaScript): ```javascript function getPaginatedData(page) { $.ajax({ url: '/get_paginated_data/', type: 'GET', data: {page: page}, success: function (response) { // 解析后端返回的 JSON 数据 var current_page = response.current_page; var total_pages = response.total_pages; var items = response.items; // 渲染数据到页面上 // ... }, error: function (xhr, status, error) { console.log(error); } }); } // 页面加载完成后,获取第一页的数据 $(document).ready(function () { getPaginatedData(1); }); // 翻页按钮点击事件 $('.pagination-button').click(function () { var page = $(this).data('page'); getPaginatedData(page); }); ``` 以上代码仅为示例,具体的实现方式可能因项目需求而有所不同。你可以根据实际情况进行调整和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值