Python的Flask框架中前端通过筛选添加动态排序功能

浏览: 3965

使用flask框架的时,前端通过使用bootstrap的form结构添加多选功能,使用多选的选择时候返回一个筛选后的结果,这样想对结果排序就需要动态排序功能

方法一:

       在SQL中非常简单,即语句SELECT Row_Number() OVER (),* FROM tablename;而flask中需要在views经过对表的筛选结果(filter)添加排序语句,这样在models中引用sqlalchemy的func函数就可以实现。

example:

1.在model语句

from sqlalchemy import or_,func
class tablename(db.Model):
__tablename__ = 'tablename' #在sql中表的名字
    data  = db.Column(db.String(20), primary_key=True)
    row   = db.column_property(func.rank().over(order_by='data desc NULLS LAST'))

2.view中语句

@main.route('/search', methods=['GET', 'POST'])
def data_search():
form = QueryForm() #form中定义的类
page = request.args.get('page', 1, type=int)
show_followed = False
if form.validate_on_submit():
session['data']=form.data.data
return redirect(url_for('.data_search'))
pagination = tablename.query.filter(session.get('data')=='zzz').paginate(page, per_page=10,error_out=False)
posts = pagination.items
return render_template('search.html',form=form, posts=posts,show_followed=show_followed, pagination=pagination)

3.HTML前端展示

</table>
{% for post in posts %}
<tr id="{{ post.xxx}}">
<td class="a">{{ post.xxx}}</td>
<td class="b">{{post.row}} </td></tr>
{% endfor %}
</table>

这样就可以实现flask框架中前端筛选后返回的结果排序序号

其它sqlalchemy的column_property相关信息可以参考官方文档:http://docs.sqlalchemy.org/en/latest/orm/mapping_columns.html?highlight=column_property#sqlalchemy.orm.column_property

方法二:

     在views把对应数据的序号生成字典,数据以json格式传递给js,序号加载在前端

example:

1.在model语句

class tablename(db.Model):
__tablename__ = 'tablename' #在sql中表的名字
    data  = db.Column(db.String(20), primary_key=True)

2.views语句

@main.route('/search', methods=['GET', 'POST'])
def data_search():
form = QueryForm() #form中定义的类
page = request.args.get('page', 1, type=int)
show_followed = False
if form.validate_on_submit():
session['data']=form.data.data
return redirect(url_for('.data_search'))
paginations = tablename.query.filter(session.get('data')=='zzz').order_by(tablename.data.desc().nullslast())
pagination = paginations.paginate(page, per_page=10,error_out=False)
posts = pagination.items
number = [x for x in range(paginations.count())]
data = [x.data for x in paginations]
num = dict(zip(data,number))
return render_template('search.html',form=form, posts=posts,show_followed=show_followed, pagination=pagination,num=num)

3.HTML前端展示

{% import "bootstrap/wtf.html" as wtf %}
<div class="form-inline" role="form">
{{ wtf.quick_form(form) }}
</div>
</table>
{% for post in posts %}
<tr class='row' id="{{ post.data }}">
<td class="a"></td>
<td class="b">{{ post.data }} </td></tr>
{% endfor %}
</table>
<script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
<script>
$(document).ready(function() {
nnn = {{num|safe}};
$("tr.row").each(function(i){
data = $(this).children('td.b').text();
$("tr.row#" + data).children('td.a').html(nnn[data]+1);
});
});
</script>

这种方法比较笨拙,相比较而言,还是第一种方法比较方便,在此主要是借鉴和参考

推荐 2
本文由 走马兰台 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册