如何在Jinja2模板中为图像嵌入python代码?

时间:2015-01-15 17:53:26

标签: python flask jinja2

我有以下代码,我正在尝试在页面上加载jpg图像。在这种情况下,图像具有数据库记录1.jpg的主键ID。我想使用{{film.id}}。jpg之类的东西。怎么做?下面的代码不会渲染图像。

film.id只是记录中的主键。我想将它作为参考索引号用于其胶片的相应图像。在标签中,film.id应该扩展为整数。由于我在数据库中只有两部电影,因此应该是1和2。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>MovieDB</title>
</head>
<body>
{% for film in films %}
    <p>{{ film.title }}</p>
    <img src="{{ url_for('static', filename='img/{{ film.id }}.jpg') }}">
{% endfor %}        
</body>
</html>

我尝试将Alex提供的示例添加到我的views.py:

from flask import render_template, url_for
from app import app
from jinja2 import filters, environment
from app.models import *


@app.route('/')
@app.route('/index')
def index():
    films = session.query(Film).all()

    return render_template('index.html', films=films)

def ufs(film_id):
    return url_for('static', filename='img/{}.jpg'.format(film_id))

app.filters['ufs'] = ufs

它提供以下堆栈跟踪:

Traceback (most recent call last):
  File "run.py", line 1, in <module>
    from app import app
  File "/Users/jwebster/Code/Python/filmdb/app/__init__.py", line 7, in <module>
    from app import views
  File "/Users/jwebster/Code/Python/filmdb/app/views.py", line 17, in <module>
    app.filters['ufs'] = ufs
AttributeError: 'Flask' object has no attribute 'filters'

1 个答案:

答案 0 :(得分:6)

您需要定义自定义过滤器(并使用Jinja2注册),以允许从Jinjia2模板中访问任意Python代码。有关所有详细信息,请参阅http://jinja.pocoo.org/docs/dev/api/#custom-filters

例如,在您的Python服务器代码中,在启动时:

def ufs(film_id):
    return url_for('static', filename='img/{}.jpg'.format(film_id))

environment.filters['ufs'] = ufs

其中environment是您的Jinja2环境,并且您import可以url_for作为非限定名称显示。

然后,在从此环境渲染的Jinja2模板中,

{{ film.id | ufs }}

会根据您的需要进行扩展(如果film.id正确 - 可能内部 for,但您已将置于之外,至少在你的Q的当前版本中,这可能会因其他原因而破坏。)