从Jinja模板调用Python函数

时间:2015-07-30 15:02:42

标签: python flask jinja2

有没有办法在Jinja模板中调用Python函数?该函数只接受字符串years并将其转换为列表。

years = years.replace('[', '')
years = years.replace(']', '')
years = years.split(',')

如何在下面的模板中years上调用此内容?

{% extends "base.html" %}
{% import "_macros.html" as macros %}

{% block title %}Year Results{% endblock %}

{% block page_content %}
<div class="page-header">
    <h1>Year Search Results</h1>
</div>
<ul class=entries>
    {% for entry in entries %}
    <li><h3><a href="{{ url_for('main.grantinfo', applid=entry.appl_id) }}">{{ entry.appl_id }} : {{ entry.project_title }}</a></h3>
    <br>
    {% else %}
    <li><em>No entry here</em>
    {% endfor %}
</ul>

{% if pagination %}
<div class="pagination">
    {{ macros.pagination_widget(pagination, '.yearresults', years=years) }}
</div>
{% endif %}
{% endblock %}

2 个答案:

答案 0 :(得分:8)

years似乎是一个JSON列表,因此请使用json.loads来解析它,而不是手动剥离和拆分字符串。 years似乎是从视图发送到模板的变量,因此只需在视图中进行处理。

years = json.loads(years)
# years string "[1999, 2000, 2001]"
# becomes list [1999, 2000, 2001]
# without parsing the string manually
return render_template('years.html', years=years)

如果你真的需要在模板中使用它(你可能没有),你可以将json.loads添加到Jinja全局变量中。

app.add_template_global(json.loads, name='json_loads')

然后在模板中使用它,就像普通函数一样。

{{ macros.pagination_widget(pagination, '.yearresults', years=json_loads(years)) }}

答案 1 :(得分:4)

可以如下:

首先在main.py文件中

def myYearLister(year):
    return year.INTOLISTORWHATEVER

然后在main.py中包含以下内容(在函数之后更好地执行此操作)以使函数可全局访问

app.jinja_env.globals.update(myYearLister=myYearLister) 

最后,您可以调用或使用模板中的功能

<div> {{ myYearLister(anything) }} </div>