最近做flask的项目,需要增加翻页的功能,网上找的教程都是结合sqlalchemy的,可是我用的不是sqlalchemy,肿木办呢?

以下是我的做法

一、前端

  1、传递页码

  前端我使用ajax提交表单的,所以在前端的表单里加上page这一项(隐藏),然后在ajax中编辑这一项的value并提交到后端,页码就是这么传递到后端的

  表单的代码

<form id ="submit_form">
{{ form.hidden_tag() }}
<div id="input-top">
<div class="form-group">
<label>{{ form.account_id.label }}</label>
{{ form.account_id }}
<label>{{ form.user_id.label }}</label>
{{ form.user_id }}
<br/>
<label>{{ form.character_name.label }}</label>
{{ form.character_name }}
<input id="page" name="page" type="hidden" value="1"/>
</div>
</div>
<button type="button" class = "querybtn" onclick="ajaxForm(1)">查询</button>
</form>

  ajax的代码

    //ajax提交表单
function ajaxForm(page_id){
//varifyinput();
document.getElementById("page").value = page_id;//在此编辑表单中的page,提交到后端,注意要在获取表单前编辑,否则提交的就是上一次翻页的值
var form= new FormData(document.getElementById("submit_form"));
$.ajax({
url:"{{ url_for('main.query_character_list') }}",
type:"post",
data:form,
dataType: 'json',
processData:false,
contentType:false,
beforeSend:function(){
$("#dialog_message").show();
del_table();
},
success:function(data){
$("#dialog_message").hide();
create_table(data.result_table);
if(Number(data.length)>0){
table_length = Number(data.length)//如果是第一次查询,更新总页数
}
if(page_id === 1){
cur_page = 1;//为当前页的页码赋值
document.getElementById("page_display").innerHTML="当前页"+cur_page+"/"+table_length//编辑页面显示页码
}
},
error:function(e){
$("#dialog_message").hide();
del_table();
alert("没有取得数据");
}
})
}

  2、翻页函数

  翻页使用按钮来翻页,按钮按下直接执行js的翻页函数,函数中为页码加减后调用ajax提交表单,并更新网页上显示的页码值

  html代码

<button type="button" class = "pagebtn" onclick="prev_page()">上一页</button>
<span id ="page_display" style="display: inline">当前页1/{{length}}</span>
<button type="button" class = "pagebtn" onclick="next_page()">下一页</button>

  js代码

    //翻页函数
function next_page(){
cur_page = cur_page + 1;
if(cur_page < table_length){
ajaxForm(cur_page);
document.getElementById("page_display").innerHTML="当前页"+cur_page+"/"+table_length
}
else if(cur_page === table_length){
ajaxForm(cur_page);
document.getElementById("page_display").innerHTML="当前页"+cur_page+"/"+table_length
}
else{
cur_page = table_length;
document.getElementById("page_display").innerHTML="当前页"+cur_page+"/"+table_length
}
}
function prev_page(){
cur_page = cur_page - 1;
if(cur_page > 1){
ajaxForm(cur_page);
document.getElementById("page_display").innerHTML="当前页"+cur_page+"/"+table_length
}
else if(cur_page === 1){
ajaxForm(cur_page);
document.getElementById("page_display").innerHTML="当前页"+cur_page+"/"+table_length
}
else{
cur_page = 1;
document.getElementById("page_display").innerHTML="当前页"+cur_page+"/"+table_length;
}
}

  3、总页数

  总页数这个是后端在第一次查询数据的时候全量查询数据,然后计算出来的,这样后边每次翻页只要查询翻页范围内的数据就行,而不用获得,前面的ajax中在第一次查询的时候会更新总长度length的值,这个要首先在js中申明变量,不然会出错

  我的代码中因为有些事不需要点击查询就会自动显示全部数据,所以在初始化length变量时直接使用jinja2的{{}}从后端获取

  JS代码

    var table_length = "{{length}}";//分页总长度,注意js中引用jinja2的变量要用双引号括起来
var cur_page = 1;
//清空表格
function del_table(){
tableNode = document.getElementById("result_table");
var rowNum = tableNode.rows.length;
for(j=rowNum-1;j>0;j--){
tableNode.deleteRow(j);
}//删除原来的结果
}

二、后端

  后端就见仁见智了,我的程序是view函数先将变量传到相应的数据处理对象格式化数据,然后调用其他对象从数据库查询,这样在就分为view,处理对象,调用类 三个方面来处理

  1、view

  分页长度在登录时放到session里,session['page_interval']

  视图函数通过表单获取页码,传递给后端,这里也要分第一次查询和后续查询

    if form.validate_on_submit():
page = int(request.form['page'])
AccountList_obj = AccountList(form, db_obj, page)#个人的代码习惯,先实例化再调用方法
(result, length) = AccountList_obj.process()
if page == : # 第一次查询的时候返回的页码是第一页,这时候做全量查询,但是只返回一部分数据和所有的页码,之后每次查询都只查询一部分,但是如果又翻回第一页就只能陪绑了
return jsonify({"result_table": result, 'length': length}) # 是第一页就更新js的length变量,否则就不更新
else:
return jsonify({"result_table": result, 'length': 0})#这个length就约定为0,如果是0前端js就不会更新length

  2、处理对象

  向调用的对象传递页码,如果是第一页还要一些特殊的处理,得到页数并只输出第一页

def process(self):
#其他处理语句
page_interval = session['page_interval']#获取每页间隔
#分页返回结果
if self.page == 1: # 第一次查询,返回全量
AccountListProcess_obj = AccountListProcess(account_id = account_id, fb_account = fb_account,
db_conn = db_conn, page = self.page)
(result,length) = AccountListProcess_obj.process()
#计算总页数
if length % page_interval == 0:#如果正好是间隔的整数倍条数据
page_length = length / page_interval
else:
page_length = length / page_interval + 1
if page_length == 0:#如果不足一页最少也是一页
page_length = 1
return (result, page_length)
else:
AccountListProcess_obj = AccountListProcess(account_id=account_id, fb_account=fb_account,
db_conn=db_conn, page=self.page)
(result,length) = AccountListProcess_obj.process()
return (result, length) # 第二个随便了

  3、调用的对象

  先拼接数据库中查询的limit语句,然后在拼接sql语句的时候吧这个语句放到最后

    def process(self):
#blah blah blah
page_interval = session['page_interval']
page_start = (self.page - 1) * page_interval
page_str = "limit {page_start},{page_interval}".format(page_start=page_start,page_interval=page_interval)
#计算总长度
sql = 'select count(*) from blah blah blah'
#blah blah blah
length = cur.fetchone()[0]
#blah blah blah
sql = '''
blah blah blah {page_str};
'''.format(page_str=page_str)
#execute sql and blah blah blah
result = cur.fetchall()
return (result,length)

三、最终结果

  如图

  

如果我有什么做得不对的地方,请各位指出来,反正我也不会改的

Flask添加翻页功能(非sqlalchemy)的更多相关文章

  1. Web测试——翻页功能测试用例

    参考:https://wenku.baidu.com/view/e6462707de80d4d8d15a4f1e.html?rec_flag=default&mark_pay_doc=2&am ...

  2. [Qt] CFlip 翻页功能实现

    由于需要给table制作翻页功能,所以写了一个翻页的类. 看上去总体效果感觉还是不错的,哈哈. //flip.h #ifndef CFLIP_H #define CFLIP_H #include &l ...

  3. jsp实现上一页下一页翻页功能

    前段时间一直忙于期末考试和找实习,好久没写博客了. 这段时间做了个小项目,包含了翻页和富文本编辑器Ueditor的两个知识点,Ueditor玩的还不是很深,打算玩深后再写篇博客. 要实现翻页功能,只需 ...

  4. Atitit 翻页功能的解决方案与版本历史 v4 r49

    Atitit 翻页功能的解决方案与版本历史 v4 r49 1. 版本历史与分支版本,项目版本记录1 1.1. 主干版本历史1 1.2. 分支版本  项目版本记录.1 2. Easyui 的翻页组件2 ...

  5. Atitit.pagging  翻页功能解决方案专题 与 目录大纲 v3 r44.docx

    Atitit.pagging  翻页功能解决方案专题 与 目录大纲 v3 r44.docx 1.1. 翻页的重要意义1 1.2. Dep废弃文档   paip.js翻页分页pageing组件.txt1 ...

  6. PyQt—QTableWidget实现翻页功能

    主要使用QTableWidget中的三个函数实现: verticalScrollBar().setSliderPosition() 设置当前滑动条的位置 verticalScrollBar().max ...

  7. pyspider示例代码五:实现自动翻页功能

    实现自动翻页功能 示例代码一 #!/usr/bin/env python # -*- encoding: utf- -*- # Created on -- :: # Project: v2ex fro ...

  8. jsp实现翻页功能

    jsp实现翻页功能 要实现翻页功能,只需要设置一个pageIndex即可,然后每次加载页面时通过pageIndex去加载数据就行. 那么我们可以设置一个隐藏的input框,用于传递pageIndex给 ...

  9. jquery.Table实现的翻页功能比较完整漂亮,本想扩展个模版DIV

    jquery.dataTable实现的翻页功能比较完整漂亮,本想提取其的翻页部分,再结合模版DIV,bootstrop实现聊天记息的展示. jquery.Table 与table结合的较紧,不能在很下 ...

随机推荐

  1. Linux hwclock 命令

    hwclock 即 Hardware Clock 硬件时钟,该命令用于查询或设置硬件时钟:硬件时钟是指主机板上的时钟设备,也就是通常可在 BIOS 画面设定的时钟:系统时钟是指 Kernel 中的时钟 ...

  2. iOS富文本组件的实现—DTCoreText源码解析 数据篇

    本文转载 http://blog.cnbang.net/tech/2630/ DTCoreText是个开源的iOS富文本组件,它可以解析HTML与CSS最终用CoreText绘制出来,通常用于在一些需 ...

  3. Java中DESKeySpec类

    此类位于 javax.crypto.spec 包下.声明如下: public class DESKeySpec extends Object implements KeySpec 此类指定一个 DES ...

  4. java基础---->java中国际化的实现

    应用程序的功能和代码设计考虑在不同地区运行的需要,其代码简化了不同本地版本的生产.开发这样的程序的过程,就称为国际化.今天,我们就开始学习java中国际化的代码实现. Java国际化主要通过如下3个类 ...

  5. C#文件下载的几种方式

    第一种:最简单的超链接方法,<a>标签的href直接指向目标文件地址,这样容易暴露地址造成盗链,这里就不说了 1.<a>标签 <a href="~/Home/d ...

  6. 【BZOJ5008】方师傅的房子 三角剖分

    [BZOJ5008]方师傅的房子 Description 方师傅来到了一个二维平面.他站在原点上,觉得这里风景不错,就建了一个房子.这个房子是n个点的凸多边形,原点一定严格在凸多边形内部.有m个人也到 ...

  7. 【BZOJ2502】清理雪道 有上下界的网络流 最小流

    [BZOJ2502]清理雪道 Description        滑雪场坐落在FJ省西北部的若干座山上. 从空中鸟瞰,滑雪场可以看作一个有向无环图,每条弧代表一个斜坡(即雪道),弧的方向代表斜坡下降 ...

  8. 树链剖分-点的分治(点数为k且距离最长的点对)

    hdu4871 Shortest-path tree Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 130712/130712 K ( ...

  9. Linux登录失败处理功能

     本文要实现的功能:如果有人恶意尝试破解你的服务器密码,那么这个功能就能帮你起到一定的作用,当尝试密码错误超过设定的次数后,就会锁定该账户多长时间(自行设定),时间过后即可自行解锁,这样可以增加攻击者 ...

  10. poj2376 Cleaning Shifts【线段树】【DP】

    Cleaning Shifts Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 32561   Accepted: 7972 ...