我正在使用Python / Flask来创建一个简单的数据库应用程序。我有一个查询,显示由各种参数筛选的事务。我将这些参数作为URL参数传递给我的“view_transactions”Flask视图函数。
查询是分页的,一次显示几个事务。我需要在分页“>>”上重复所有原始查询网址参数和“<<”链接,就像它们丢失时一样,意味着在导航结果时清除过滤器。
我可以通过将所有参数明确地按名称传递到我用来构建“>>”/“<<”的url_for来做到这一点链接,因此:
<a href="{{ url_for('view_transactions', page=transactions.next_num, account=account_parm, category=category_parm, ...) }}">{{ _('>>') }}</a>
我正在使用的views.py代码是:
@app.route('/view/transactions', methods=['GET','POST'])
@app.route('/view/transactions/<int:page>', methods=['GET', 'POST'])
@login_required
def view_transactions(page=1):
tq = db.session.query(Transaction).order_by(desc(Transaction.id))
get_temp = request.args.get('category')
if get_temp != None:
tq = tq.filter_by(category=get_temp)
get_temp = request.args.get('account')
if get_temp != None:
tq = tq.filter_by(account=get_temp)
start_date = request.args.get('start_date')
end_date = request.args.get('end_date')
if start_date != None:
tq = tq.filter(Transaction.date>=(start_date))
if end_date != None:
tq = tq.filter(Transaction.date<=(end_date))
transactions = paginate(tq, page, POSTS_PER_PAGE)
return render_template('transactions.html',
title='Transactions',
transactions=transactions,
account_parm=request.args.get('account'),
category_parm=request.args.get('category'))
我用来访问该页面的URL是 http://localhost:5000/view/transactions/1?account=AT1&category=CT2
然而,当我引入额外的参数时,这是一件单调乏味且难以维护的事情。有没有办法自动传递该页面上链接上父页面上使用的所有相同URL参数?
答案 0 :(得分:2)
在这种情况下,您始终可以生成网址生成 HELPER
。请访问 - http://flask.pocoo.org/snippets/44/
这是可能的辅助函数,您可以通过它传递额外的参数 -
def url_for_other_page(page):
args = request.view_args.copy()
args['page'] = page
return url_for(request.endpoint, **args)
app.jinja_env.globals['url_for_other_page'] = url_for_other_page
在上面的代码中,您可以使用额外的参数(例如
)进一步扩展args
Jinja2模板
{% macro render_pagination(pagination) %}
<div class=pagination>
{%- for page in pagination.iter_pages() %}
{% if page %}
{% if page != pagination.page %}
<a href="{{ url_for_other_page(page) }}">{{ page }}</a>
{% else %}
<strong>{{ page }}</strong>
{% endif %}
{% else %}
<span class=ellipsis>…</span>
{% endif %}
{%- endfor %}
{% if pagination.has_next %}
<a href="{{ url_for_other_page(pagination.page + 1)
}}">Next »</a>
{% endif %}
</div>
{% endmacro %}
请确保您参考网址http://flask.pocoo.org/snippets/44/以获取具体说明。
答案 1 :(得分:1)
只需使用request.query_string
,因为request
可以作为standard context的一部分使用<a href="{{ url_for('view_transactions',
page=transactions.next_num,
account=account_parm,
category=category_parm,
...) }}?{{request.query_string}}">{{ _('>>') }}</a>
:
301