初学flask
,之前只是用python
写过一些简单的统计脚本,都是按照《FlaskWeb开发:基于Python的Web应用开发实战》这本书上的步骤敲出来的,作为练手,就想着把公司的通讯录用flask
实现下,对于用户的展示、分页以及管理员登录等操作都没有遇到大的问题,仔细想想都能解决了。
但为了更加人性化,我想把搜索功能加到页面上,目标是下拉框中显示出现有的部门,选中部门提交后把对应部门的员工列出来,最开始使用的是POST,然后返回,第一页是完全正确的,但点击第二页时,请求变成了GET,会把所有的员工页的第二页展示出来,这就很纠结了,研究了一晚上,通过搜索找到了方法,把POST请求通过redirect_url
的方式转换成GET请求,并把POST的参数传递给GET。
以下是我的view视图的代码:
@main.route('/', methods=['GET', 'POST'])
def index():
form = Orderbydep()
page = request.args.get('page', 1, type=int)
department_name = request.args.get('department_name')
if form.validate_on_submit() and request.method == 'POST':
department_name = form.department_name.data
return redirect(url_for('.index', department_name=department_name))
elif department_name is None:
page = request.args.get('page', 1, type=int)
pagination = User.query.join(Department, User.department_id == Department.id).add_entity(Department).paginate(
page, error_out=False)
user = pagination.items
dep = Department.query.all()
return render_template('index.html', user=user, form=form, pagination=pagination,
department_name=department_name)
else:
department_id = Department.query.filter_by(departmentname=department_name).first().id
pagination = User.query.filter_by(department_id=department_id).paginate(
page,
error_out=False)
user = pagination.items
return render_template('index.html', user=user, form=form, pagination=pagination,
department_name=department_name)
Order_by的form代码:
class Orderbydep(FlaskForm):
department_name = SelectField('员工部门')
submit = SubmitField('submit')
def __init__(self, *args, **kwargs):
super(Orderbydep, self).__init__(*args, **kwargs)
self.department_name.choices = [(department.departmentname, department.departmentname)
for department in Department.query.order_by(Department.departmentname).all()]
直接请求时的GET是把所有的员工列出来,如果是通过POST转换的GET请求则把对应部门的员工列出来,这样就需要在模板里面分页相关加上POST传给GET的部门参数,通过url直接加参数方式查询数据并展示。
模板分页代码:
{{ macros.pagination_widget(pagination, '.index',department_name=department_name) }}