如果被{{delimiter}}包围,则不打印Jinja2变量(字符串)

时间:2014-06-02 21:09:38

标签: python jinja2

我在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一直在剥离它。

1 个答案:

答案 0 :(得分:0)

好的,我自己解决了这个问题。我的数据库值中包含{{vehicle.id}}语法的原因是因为我想让jinja解析它。因此,当jinja没有解析它时(可能是因为上下文问题),我选择了一个自定义过滤器,我很高兴在路上。

以下是它的要点:

Jinja2过滤器

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 %}