Flask在模板链接中重复网址参数

时间:2015-06-28 12:18:20

标签: python flask

我正在使用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参数?

2 个答案:

答案 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
  • args ['extra-params1'] = extra-params-1
  • args ['extra-params2'] = extra-params-2
  • args ['extra-params3'] = extra-params-3
  • 这些参数可以进一步用于jinja2模板 - {{url_for_other_page(extra-param2)}}“&gt; {{extra-param2}}任何网址。

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 &raquo;</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