使用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>
这种方法比较笨拙,相比较而言,还是第一种方法比较方便,在此主要是借鉴和参考