Python-Django-Ajax分页功能实现

Django-Ajax分页功能实现

前言

Django框架,ajax分页功能实现,包含MVT三大板块的代码及注释。


前端(T: 模板)

注意: 整个样式用的是Bootstrap,所以使用的时候要引入bootstrap的层叠样式表和JS脚本。


<table  class="table table-striped">
	
	<thead>
		<tr>
			<td style="font-weight: bolder">
				<input type="checkbox" class="box-title">
			td>
			<td style="font-weight: bolder">
				姓名
			td>
			<td style="font-weight: bolder">
				年龄
			td>
			<td style="font-weight">
				性别
			td>
		tr>
	thead>
	
	<tbody id="generatedTable">tbody>
table>


<div>
	<ul class="pagination pagination-lg" style="font-weight: bold">
		<li><a href="#">«a>li>
		<li><a onclick="dividePage(this)">1a>li>
		<li><a onclick="dividePage(this)">2a>li>
		<li><a onclick="dividePage(this)">3a>li>
		<li><a onclick="dividePage(this)">4a>li>
		<li><a onclick="dividePage(this)">5a>li>
		<li><a onclick="dividePage(this)">6a>li>
		<li><a onclick="dividePage(this)">7a>li>
		<li><a onclick="dividePage(this)">8a>li>
		<li><a href="#">»a>li>
	ul>
div>

JS:

function dividePage(t) {
	// 获取页码
	const page_num = t.innerText;

	// post请求从后台取数据
	$.ajax({
		url: '/excel_generate/divide_page',
		type: 'post',
		async: true, // 开启同步
		data: {
			'page_num': page_num,
		},
		success: function (result) {
			// 成功回传数据
			if (result.res === 1) {
				var str_content = "";
				// 从后台传回的数据不为空
				if (result.data.length > 0) {
					$.each(result.data, function (index, item) {
						str_content += "" + item['name'] + "" + item['age'] + "" + item['sex'] + ""
						})
				} 
				// 从后台传回的数据为空 显示此页面没有要显示的数据
				else {
					str_content += "" + "此页面没有要显示的数据" + "";
				}
				
				// 覆盖表体内容
				$('#generatedTable').html(str_content);
				}
					
			// 数据返回失败
			else {
				alert('数据返回失败');
			}
		}
	})
}

后端(V: 视图函数)

from .model import DataModel  # 导入模型类

def extractDividePageData(database, page_num):
    """从数据库中抽取分页数据"""
    data = []
    # 先从数据库中读数据
    msg_list = list(database.objects.filter(is_display=True))

    # 将数据变成JSON能解析的格式
    for msg in msg_list:
        # 添加到data中
        data.append({
            'name': msg.name,
            'age': msg.age,
            'sex': msg.sex
        })
    
    # 如果数据库中没有数据
    if len(msg_list) == 0:
        return {}

    # 数据库中有数据
    else:
        # 计算总页数(18是每一页数据量)
        total_page = (len(data) // 18) + 1
        
        # 总页数比要请求的页数小
        if total_page < page_num:
            return {}
        
        # 总页数刚好等于请求的页数
        elif total_page == page_num:
            start = 18 + (page_num - 2) * 18
            return data[start:]
        # 总页数大于请求的页数
        else:
            start = 18 + (page_num - 2) * 18
            stop = 18 + 18 * (page_num - 1)
            return data[start:stop]

@csrf_exempt
def divide_page(request):
    """分页"""
    page_num = int(request.POST.get('page_num'))
    
    # 获取数据, 第一个参数是保存数据的数据库对应的模型类,第二个参数是前端获取到的页码
    try:
    	page_data = extractDividePageData(DataModel, page_num)
    except Exception as e:
    	return JsonResponse({'res': 0, 'data': {})
    else:
    	return JsonResponse({'res': 1, 'data': page_data})

模型类(M)

class DataModel(models.Model):
	"""模型类"""
	name = models.CharField(max_length=16)
	age = models.IntegerField()
	sex = models.CharField(max_length=4)
	is_display = models.BooleanField(default=True)

以上。

你可能感兴趣的:(全栈开发,django,windows,python,pycharm,后端)