在jinja2中通过引用或返回值传递

时间:2013-08-27 02:21:50

标签: jinja2

我有一些代码,我在其中一个jinja2模板中重复了很多。当我将一个字符串转换为一个链接时,我想检查它是否有一个尾随/结尾,如果是,则截断它。这就是我想要的样子。

{% macro remove_trailing_slash(path) %}
  {% if path[-1:] == '/' %}
    {{ path[:-1] }}
  {% else %}
    {{ path }}
  {% endif %}
{% endmacro %}

我遇到的问题是弄清楚如何将修改后的路径传递回原始调用者。我似乎无法在jinja2文档中找到return语句。

1 个答案:

答案 0 :(得分:3)

使用Jinja中的filter而不是macro可以做得更好。

在我的理解中,宏是用于重用逻辑片段,它们并不真正映射到Python中的函数(它将在Jinja编译器的权限范围内将宏的内容复制到每个地方调用宏)。另一方面,过滤器设计用于在将模板的数据传递到“输出流”之前对其进行操作。

如果您在Jinja环境中注册filter,那么您可以执行以下操作:

{{ one_url | remove_trailing_slash }}
{{ another_url | remove_trailing_slash }}

如果您在整个模板中执行此操作,最好在将这些值传递给模板之前对其进行清理。

您还可以创建一个宏来包装此模式:

{% macro link(url) %}
<a href="{{ url }}">{{ url | remove_trailing_slash }}</a>
{% endmacro %}