我在jinja2中有一个完美的工作,直到我尝试将字符串传递给它看起来像这个/test/{{ vehicle.id }}
。打印到页面的字符串为/test/
。
字符串来自数据库,所以我对发生的事情感到有些困惑。这就像jinja试图解析字符串并替换值(这实际上是我想要完成的事情),但它失败了,而是将表达式翻录出来。我尝试将车辆字典传递给宏观,以确定它是否“正常工作”,但没有骰子。我想如果我可能vehicle
可用于上下文,那么我可以毫不费力地工作。
以下是一些简单的示例代码:
# Assume db_values.url is set to '/test/{{ vehicle.id }}'
{% macro banner(db_values, vehicle={}) %}
<a href="{{ db_values.url }}"></a>
{% endmacro %}
我在说它的地方:
# Assume vehicle = { 'id': '1' }
{{ vehicle.id }}
{{ db_values }}
<div class="banner-link">
{{ banner(db_values, vehicle) }}
</div>
这就是输出到页面的内容:
1
{u'url': u'/test/'}
<div class="banner-link">
<a href="/test/"></a>
</div>
直接在终端击中mongodb回复:
{ 'url': 'test/{{ vehicle.id }}' }
其他人之前遇到过类似的事吗?基本上我要做的是允许管理员界面中的某个人在url中使用基于页面上下文在运行时替换的令牌。看起来很简单,但是jinja一直在剥离它。
答案 0 :(得分:0)
好的,我自己解决了这个问题。我的数据库值中包含{{vehicle.id}}语法的原因是因为我想让jinja解析它。因此,当jinja没有解析它时(可能是因为上下文问题),我选择了一个自定义过滤器,我很高兴在路上。
以下是它的要点:
from jinja2 import Environment
def replace_tokens(url, vehicle):
if url is not None:
url = Environment().from_string(url).render({ 'vehicle': vehicle })
return url
# Assume db_values.url is set to '/test/{{ vehicle.id }}'
{% macro banner(db_values, vehicle={}) %}
<a href="{{ db_values.url | replace_tokens(vehicle) }}"></a>
{% endmacro %}