时间:2021-07-01 10:21:17 帮助过:26人阅读
ajax的代码
- <span style="color: #008000">//</span><span style="color: #008000">ajax提交表单</span>
- <span style="color: #0000ff">function</span><span style="color: #000000"> ajaxForm(page_id){
- </span><span style="color: #008000">//</span><span style="color: #008000">varifyinput();</span>
- document.getElementById("page").value = page_id;<span style="color: #008000">//</span><span style="color: #008000">在此编辑表单中的page,提交到后端,注意要在获取表单前编辑,否则提交的就是上一次翻页的值</span>
- <span style="color: #0000ff">var</span> form= <span style="color: #0000ff">new</span> FormData(document.getElementById("submit_form"<span style="color: #000000">));
- $.ajax({
- url:</span>"{{ url_for(‘main.query_character_list‘) }}"<span style="color: #000000">,
- type:</span>"post"<span style="color: #000000">,
- data:form,
- dataType: </span>‘json‘<span style="color: #000000">,
- processData:</span><span style="color: #0000ff">false</span><span style="color: #000000">,
- contentType:</span><span style="color: #0000ff">false</span><span style="color: #000000">,
- beforeSend:</span><span style="color: #0000ff">function</span><span style="color: #000000">(){
- $(</span>"#dialog_message"<span style="color: #000000">).show();
- del_table();
- },
- success:</span><span style="color: #0000ff">function</span><span style="color: #000000">(data){
- $(</span>"#dialog_message"<span style="color: #000000">).hide();
- create_table(data.result_table);
- </span><span style="color: #0000ff">if</span>(Number(data.length)>0<span style="color: #000000">){
- table_length </span>= Number(data.length)<span style="color: #008000">//</span><span style="color: #008000">如果是第一次查询,更新总页数</span>
- <span style="color: #000000"> }
- </span><span style="color: #0000ff">if</span>(page_id === 1<span style="color: #000000">){
- cur_page </span>= 1;<span style="color: #008000">//</span><span style="color: #008000">为当前页的页码赋值</span>
- document.getElementById("page_display").innerHTML="当前页"+cur_page+"/"+table_length<span style="color: #008000">//</span><span style="color: #008000">编辑页面显示页码</span>
- <span style="color: #000000"> }
- },
- error:</span><span style="color: #0000ff">function</span><span style="color: #000000">(e){
- $(</span>"#dialog_message"<span style="color: #000000">).hide();
- del_table();
- alert(</span>"没有取得数据"<span style="color: #000000">);
- }
- })
- }</span>
2、翻页函数
翻页使用按钮来翻页,按钮按下直接执行js的翻页函数,函数中为页码加减后调用ajax提交表单,并更新网页上显示的页码值
html代码
- <span style="color: #0000ff"><</span><span style="color: #800000">button </span><span style="color: #ff0000">type</span><span style="color: #0000ff">="button"</span><span style="color: #ff0000"> class </span><span style="color: #0000ff">= "pagebtn"</span><span style="color: #ff0000"> onclick</span><span style="color: #0000ff">="prev_page()"</span><span style="color: #0000ff">></span>上一页<span style="color: #0000ff"></</span><span style="color: #800000">button</span><span style="color: #0000ff">></span>
- <span style="color: #0000ff"><</span><span style="color: #800000">span </span><span style="color: #ff0000">id </span><span style="color: #0000ff">="page_display"</span><span style="color: #ff0000"> style</span><span style="color: #0000ff">="display: inline"</span><span style="color: #0000ff">></span>当前页0/0<span style="color: #0000ff"></</span><span style="color: #800000">span</span><span style="color: #0000ff">></span>
- <span style="color: #0000ff"><</span><span style="color: #800000">button </span><span style="color: #ff0000">type</span><span style="color: #0000ff">="button"</span><span style="color: #ff0000"> class </span><span style="color: #0000ff">= "pagebtn"</span><span style="color: #ff0000"> onclick</span><span style="color: #0000ff">="next_page()"</span><span style="color: #0000ff">></span>下一页<span style="color: #0000ff"></</span><span style="color: #800000">button</span><span style="color: #0000ff">></span>
js代码
- <span style="color: #008000">//</span><span style="color: #008000">翻页函数</span>
- <span style="color: #0000ff">function</span><span style="color: #000000"> next_page(){
- cur_page </span>= cur_page + 1<span style="color: #000000">;
- </span><span style="color: #0000ff">if</span>(cur_page <<span style="color: #000000"> table_length){
- ajaxForm(cur_page);
- document.getElementById(</span>"page_display").innerHTML="当前页"+cur_page+"/"+<span style="color: #000000">table_length
- }
- </span><span style="color: #0000ff">else</span> <span style="color: #0000ff">if</span>(cur_page ===<span style="color: #000000"> table_length){
- ajaxForm(cur_page);
- document.getElementById(</span>"page_display").innerHTML="当前页"+cur_page+"/"+<span style="color: #000000">table_length
- }
- </span><span style="color: #0000ff">else</span><span style="color: #000000">{
- cur_page </span>=<span style="color: #000000"> table_length;
- document.getElementById(</span>"page_display").innerHTML="当前页"+cur_page+"/"+<span style="color: #000000">table_length
- }
- }
- </span><span style="color: #0000ff">function</span><span style="color: #000000"> prev_page(){
- cur_page </span>= cur_page - 1<span style="color: #000000">;
- </span><span style="color: #0000ff">if</span>(cur_page > 1<span style="color: #000000">){
- ajaxForm(cur_page);
- document.getElementById(</span>"page_display").innerHTML="当前页"+cur_page+"/"+<span style="color: #000000">table_length
- }
- </span><span style="color: #0000ff">else</span> <span style="color: #0000ff">if</span>(cur_page === 1<span style="color: #000000">){
- ajaxForm(cur_page);
- document.getElementById(</span>"page_display").innerHTML="当前页"+cur_page+"/"+<span style="color: #000000">table_length
- }
- </span><span style="color: #0000ff">else</span><span style="color: #000000">{
- cur_page </span>= 1<span style="color: #000000">;
- document.getElementById(</span>"page_display").innerHTML="当前页"+cur_page+"/"+<span style="color: #000000">table_length;
- }
- }</span>
3、总页数
总页数这个是后端在第一次查询数据的时候全量查询数据,然后计算出来的,这样后边每次翻页只要查询翻页范围内的数据就行,而不用获得,前面的ajax中在第一次查询的时候会更新总长度length的值,这个要首先在js中申明变量,不然会出错
我的代码中因为有些事不需要点击查询就会自动显示全部数据,所以在初始化length变量时直接使用jinja2的{{}}从后端获取
JS代码
- <span style="color: #0000ff">var</span> table_length = "{{length}}";<span style="color: #008000">//</span><span style="color: #008000">分页总长度,注意js中引用jinja2的变量要用双引号括起来</span>
- <span style="color: #0000ff">var</span> cur_page = 1;
二、后端
后端就见仁见智了,我的程序是view函数先将变量传到相应的数据处理对象格式化数据,然后调用其他对象从数据库查询,这样在就分为view,处理对象,调用类 三个方面来处理
1、view
分页长度在登录时放到session里,session[‘page_interval‘]
视图函数通过表单获取页码,传递给后端,这里也要分第一次查询和后续查询
- <span style="color: #0000ff">if</span><span style="color: #000000"> form.validate_on_submit():
- page </span>= request.form[<span style="color: #800000">‘</span><span style="color: #800000">page</span><span style="color: #800000">‘</span><span style="color: #000000">]
- AccountList_obj </span>= AccountList(form, db_obj, page)<span style="color: #008000">#</span><span style="color: #008000">个人的代码习惯,先实例化再调用方法</span>
- (result, length) =<span style="color: #000000"> AccountList_obj.process()
- </span><span style="color: #0000ff">if</span> page == <span style="color: #800000">‘</span><span style="color: #800000">1</span><span style="color: #800000">‘</span>: <span style="color: #008000">#</span><span style="color: #008000"> 第一次查询的时候返回的页码是第一页,这时候做全量查询,但是只返回一部分数据和所有的页码,之后每次查询都只查询一部分,但是如果又翻回第一页就只能陪绑了</span>
- <span style="color: #0000ff">return</span> jsonify({<span style="color: #800000">"</span><span style="color: #800000">result_table</span><span style="color: #800000">"</span>: result, <span style="color: #800000">‘</span><span style="color: #800000">length</span><span style="color: #800000">‘</span>: length}) <span style="color: #008000">#</span><span style="color: #008000"> 是第一页就更新js的length变量,否则就不更新</span>
- <span style="color: #0000ff">else</span><span style="color: #000000">:
- </span><span style="color: #0000ff">return</span> jsonify({<span style="color: #800000">"</span><span style="color: #800000">result_table</span><span style="color: #800000">"</span>: result, <span style="color: #800000">‘</span><span style="color: #800000">length</span><span style="color: #800000">‘</span>: 0})<span style="color: #008000">#</span><span style="color: #008000">这个length就约定为0,如果是0前端js就不会更新length</span>
2、处理对象
向调用的对象传递页码,如果是第一页还要一些特殊的处理,得到页数并只输出第一页
- <span style="color: #0000ff">def</span><span style="color: #000000"> process(self):
- </span><span style="color: #008000">#</span><span style="color: #008000">其他处理语句</span>
- page_interval = session[<span style="color: #800000">‘</span><span style="color: #800000">page_interval</span><span style="color: #800000">‘</span>]<span style="color: #008000">#</span><span style="color: #008000">获取每页间隔</span>
- <span style="color: #008000">#</span><span style="color: #008000">分页返回结果</span>
- <span style="color: #0000ff">if</span> self.page == 1: <span style="color: #008000">#</span><span style="color: #008000"> 第一次查询,返回全量</span>
- AccountListProcess_obj = AccountListProcess(account_id = account_id, fb_account =<span style="color: #000000"> fb_account,
- db_conn </span>=<span style="color: #000000"> db_conn)
- result </span>=<span style="color: #000000"> AccountListProcess_obj.process()
- </span><span style="color: #008000">#</span><span style="color: #008000">计算总页数</span>
- <span style="color: #0000ff">if</span> len(result) % page_interval == 0:<span style="color: #008000">#</span><span style="color: #008000">如果正好是间隔的整数倍条数据</span>
- page_length = len(result) /<span style="color: #000000"> page_interval
- </span><span style="color: #0000ff">else</span><span style="color: #000000">:
- page_length </span>= len(result) / page_interval + 1
- <span style="color: #0000ff">if</span> page_length == 0:<span style="color: #008000">#</span><span style="color: #008000">如果不足一页最少也是一页</span>
- page_length = 1
- <span style="color: #0000ff">return</span><span style="color: #000000"> (result[0:page_interval], page_length)
- </span><span style="color: #0000ff">else</span><span style="color: #000000">:
- AccountListProcess_obj </span>= AccountListProcess(account_id=account_id, fb_account=<span style="color: #000000">fb_account,
- db_conn</span>=db_conn, page=<span style="color: #000000">self.page)
- result </span>=<span style="color: #000000"> AccountListProcess_obj.process()
- </span><span style="color: #0000ff">return</span> (result, 0) <span style="color: #008000">#</span><span style="color: #008000"> 第二个随便了</span>
3、调用的对象
先拼接数据库中查询的limit语句,然后在拼接sql语句的时候吧这个语句放到最后
- <span style="color: #0000ff">def</span><span style="color: #000000"> process(self):
- </span><span style="color: #008000">#</span><span style="color: #008000">blah blah blah</span>
- page_interval = session[<span style="color: #800000">‘</span><span style="color: #800000">page_interval</span><span style="color: #800000">‘</span><span style="color: #000000">]
- page_start </span>= self.page *<span style="color: #000000"> page_interval
- </span><span style="color: #0000ff">if</span> self.page ==<span style="color: #000000"> 0:
- page_str </span>= <span style="color: #800000">""</span>
- <span style="color: #0000ff">else</span><span style="color: #000000">:
- page_str </span>= <span style="color: #800000">"</span><span style="color: #800000">limit {page_start},{page_interval}</span><span style="color: #800000">"</span>.format(page_start=page_start,page_interval=<span style="color: #000000">page_interval)
- </span><span style="color: #008000">#</span><span style="color: #008000">blah blah blah</span>
- sql = <span style="color: #800000">‘‘‘</span><span style="color: #800000">
- blah blah blah {page_str};
- </span><span style="color: #800000">‘‘‘</span>.format(page_str=<span style="color: #000000">page_str)
- </span><span style="color: #008000">#</span><span style="color: #008000">execute sql and blah blah blah</span>
三、最终结果
如图
如果我有什么做得不对的地方,请各位指出来,反正我也不会改的
Flask添加翻页功能(非sqlalchemy)
标签:使用 否则 code process json 实例 value 实例化 视图