如何在图像的 Jinja2 模板中嵌入 python 代码?
How to embed python code in Jinja2 template for an image?
我有以下代码,我在其中尝试在页面上加载 jpg 图像。在本例中,图像具有数据库记录的主键 ID 1.jpg。我想使用类似 {{ 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'
您需要定义一个自定义过滤器(并向 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的当前版本中,这可能会因为其他原因而破坏。
我有以下代码,我在其中尝试在页面上加载 jpg 图像。在本例中,图像具有数据库记录的主键 ID 1.jpg。我想使用类似 {{ 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'
您需要定义一个自定义过滤器(并向 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的当前版本中,这可能会因为其他原因而破坏。