先说一下我想实现的大概功能 1、首先通过Django实现表单插入数据到数据库(MySQL)——这部分略过; 2、在主页面index,加载数据库初始页面数据,然后通过“上”、“下”翻页,不刷新主页面情况下,更新页面数据
下面是代码实现: 1、‘view’函数
def t4_get(request, pindex): #获取数据库表的全部数据,且进行排序 planlist = Extradingplan.objects.order_by('-id_num') # 导入Django自带分页功能包Paginator,定义分页显示的条目 paginator = Paginator(planlist, 5) # 同样通过Paginator包功能获得总分页数 pagenum = paginator.num_pages # 这个pindex作为前端请求参数传入,也是做为后端定位页码的参数 pindex = int(pindex) # 获取pindex对应页码的分页内容 pagelist = paginator.page(pindex) """ 这部分是重点了,我估摸在这问题上卡了近两天,然后至今为止,仍有关于日期格式的问题没解决; 做序列化的原因是,Django从数据库查询出来的格式<class 'django.db.models.query.QuerySet'> 而用ajax做异步请求是需要用json格式,至今为止,json并没有对这种格式的直接转换支持,所以,我尝试 了很多格式转换,但只有序列化才能让前端json正确读取 """ # 序列化 pagelists = serializers.serialize('json', pagelist) # 把分页数据和分页总页数打包一起传递 pagedata = ({'pagelists': pagelists}, {'pagenum': pagenum}) # 这下面是我有用过的response方式,除了render,其他都能正常使用 return HttpResponse(json.dumps({'pagedata': pagedata}), content_type='application/json') # return render(request, 'ind3.html', json.dumps({'planlist': planlist}, cls=DateEncoder, ensure_ascii=False), content_type='application/json') # return JsonResponse({'pagelists': pagelists}, safe=False, content_type='application/json')2、‘url’函数
# 因为需要传入参数,所以需要用re_path而不是path re_path('^index/testget2/(?P<pindex>\d+)/$', tv.t4_get)3、‘js-Ajax’函数
分页的逻辑 - 定义两个function函数:一个页面加载全局主函数,一个是获取分页数据并生成表格的函数viewdb; - 接下来就是主函数调用子函数 - 调用子函数viewdb的原因是,后端传入数据需要反序列化,需要用json接收,并且解包成正常的Object格式; - 如果不通过这一流程,直接用url跳转页面获取数据的话,一来无法实现不刷新页面;而来请求回来的数据是json格式,无法被正常读取显示。 - 所以,这个viewdb函数不是用一次就完事的,需要被调用,还需要传入参数的调用。
我觉得分页难搞,有很大一方面在于分页的逻辑理不清楚,逻辑清晰了,代码也就容易实现了。
<script src="/static/js/jquery.js"></script> <script> var pindex = 1 // 定义全局变量,查询页码参数 var total = 1 // 全局变量,页码总数 function viewdb(pindex){ $.getJSON("testget2/" + pindex, function(ret) { var html = "" // 获取到数据后先遍历,在进行格式转换 $.each(ret, function (key, value) { // 赋值定义变量,也是一种格式转换方式 var planlist = value[0].pagelists // 分页数据是还进行解包这一步骤 var jsonplanlist = $.parseJSON(planlist) total = value[1].pagenum // 上面这部分是通过一步一步试出来的, // 充分利用console.log(total)和console.info(typeof total) // 下面就是遍历循环,获取数据,生成表格 for (var len = 0; len < jsonplanlist.length; len++) { var planlists = jsonplanlist[len].fields html += "<tr><td>" + planlists.tran_date + "</td>" + "<td>" + planlists.variety_name + "</td>" + "<td>" + planlists.method + "</td>" + "<td>" + planlists.target_price + "</td>" + "<td>" + planlists.target_stop + "</td>" + "<td>" + planlists.reason_text + "</td></tr>" } $('#di').append(html) }) }) } // 这是全局函数 $(document).ready(function(){ viewdb(pindex) // 先调用一次子函数,初始化页面 // 翻页功能的实现,每一次翻页事件发生,都是一次子函数的调用 // 至于页码的范围,也需要进行限制 $('#next').click(function () { pindex += 1 if (pindex == 0){ pindex = 1 }if (pindex > total){ pindex = total } // $('#next').attr('href','') $('#di').empty() //最后一步,在不刷新整页面同时,渲染新的数据表并显示 console.log(pindex) viewdb(pindex) }) $('#previous').click(function () { pindex -= 1 if (pindex == 0){ pindex = 1 }if (pindex > total){ pindex = total } // $('#previous').attr('href','') $('#di').empty() console.log(pindex) viewdb(pindex) }) }); </script>html文件我就不上,大同小异,关键区别只是在元素的id,只要Id对应上了,别的都没差。
至此,这个所谓的Django + Ajax + js的后台查询,异步请求,分页的功能算是实现了