Flask 分页重定向
Flask pagination redirect
我有一个使用 Flask
和 SQLAlchemy
的网上商店,我在其中使用如下路径在主页上实现了分页:
@app.route('/')
@app.route('/home')
def home():
page = request.args.get('page', 1, type=int)
data = Product.query.paginate(page=page, per_page=6)
return render_template('home.html', data=data)
我遇到的问题是搜索功能,如下所示:
@app.route('/search', methods=['GET', 'POST'])
def search():
query = request.args['search']
if len(query) > 0:
page = request.args.get('page', 1, type=int)
data = Product.query.filter(Product.name.ilike(f"%{query}%")).paginate(page=page, per_page=6)
if data is not None:
return render_template('home.html', data=data)
elif data is None:
return redirect(url_for('home'))
if len(query) == 0:
return redirect(url_for('home'))
这是我的 search
表格:
<li class="nav-item">
<form class="form-inline" action="{{ url_for('search') }}">
<input class="form-control mr-sm-2 ml-2" name="search" type="search" placeholder="Търсене" aria-label="Search">
<button class="btn btn-outline-info my-2 my-sm-0" type="submit"><i class="fa fa-search"></i></button>
</form>
</li>
这是我 home.html
中页码的 jinja2
代码:
{% for page_num in data.iter_pages(left_edge=1, right_edge=1, left_current=1, right_current=2) %}
{% if page_num %}
{% if data.page == page_num %}
<a class="btn btn-info mb-4" href="{{ url_for('home', page=page_num) }}">{{ page_num }}</a>
{% else %}
<a class="btn btn-outline-info mb-4" href="{{ url_for('home', page=page_num) }}">{{ page_num }}</a>
{% endif %}
{% endif %}
{% endfor %}
当我搜索产品时,查询会显示正在搜索的项目,但如果有多页结果,当我点击页码时,它会重定向到 home.html
,其中包含来自第一条路线。
有没有办法让搜索后的结果和search
功能的页面保持一致?
您可以使用 javascript 更新 url
中的查询
此函数将使用两个参数在当前 url 中搜索密钥,如果存在则更新它,否则添加它。
js
function url_manager(key,value){
const url = new URL(window.location.href);
url.searchParams.set(key,value );
window.location.replace(url)
}
用按钮标签替换锚标签<button class="page_num_btn_class btn btn-info mb-4" type="button">{{ page_num }}</button>
注意 - 您必须包含 jquery
<script src="https://code.jquery.com/jquery-3.1.0.js" ></script>
可以调用按钮的点击事件
$(".page_num_btn_class").click(function (e){
url_manager("page",$(this).text())
})
我有一个使用 Flask
和 SQLAlchemy
的网上商店,我在其中使用如下路径在主页上实现了分页:
@app.route('/')
@app.route('/home')
def home():
page = request.args.get('page', 1, type=int)
data = Product.query.paginate(page=page, per_page=6)
return render_template('home.html', data=data)
我遇到的问题是搜索功能,如下所示:
@app.route('/search', methods=['GET', 'POST'])
def search():
query = request.args['search']
if len(query) > 0:
page = request.args.get('page', 1, type=int)
data = Product.query.filter(Product.name.ilike(f"%{query}%")).paginate(page=page, per_page=6)
if data is not None:
return render_template('home.html', data=data)
elif data is None:
return redirect(url_for('home'))
if len(query) == 0:
return redirect(url_for('home'))
这是我的 search
表格:
<li class="nav-item">
<form class="form-inline" action="{{ url_for('search') }}">
<input class="form-control mr-sm-2 ml-2" name="search" type="search" placeholder="Търсене" aria-label="Search">
<button class="btn btn-outline-info my-2 my-sm-0" type="submit"><i class="fa fa-search"></i></button>
</form>
</li>
这是我 home.html
中页码的 jinja2
代码:
{% for page_num in data.iter_pages(left_edge=1, right_edge=1, left_current=1, right_current=2) %}
{% if page_num %}
{% if data.page == page_num %}
<a class="btn btn-info mb-4" href="{{ url_for('home', page=page_num) }}">{{ page_num }}</a>
{% else %}
<a class="btn btn-outline-info mb-4" href="{{ url_for('home', page=page_num) }}">{{ page_num }}</a>
{% endif %}
{% endif %}
{% endfor %}
当我搜索产品时,查询会显示正在搜索的项目,但如果有多页结果,当我点击页码时,它会重定向到 home.html
,其中包含来自第一条路线。
有没有办法让搜索后的结果和search
功能的页面保持一致?
您可以使用 javascript 更新 url
中的查询此函数将使用两个参数在当前 url 中搜索密钥,如果存在则更新它,否则添加它。
js
function url_manager(key,value){
const url = new URL(window.location.href);
url.searchParams.set(key,value );
window.location.replace(url)
}
用按钮标签替换锚标签<button class="page_num_btn_class btn btn-info mb-4" type="button">{{ page_num }}</button>
注意 - 您必须包含 jquery
<script src="https://code.jquery.com/jquery-3.1.0.js" ></script>
可以调用按钮的点击事件
$(".page_num_btn_class").click(function (e){
url_manager("page",$(this).text())
})