1

我有一些代码在我的一个 jinja2 模板中重复了很多次。当我将一个字符串变成一个链接时,我想检查它是否在末尾有尾随 /,如果有,则截断它。这就是我希望它看起来的样子。

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

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

4

1 回答 1

3

这是filter在 Jinja 中使用 a 而不是macro.

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

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

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

如果您在整个模板中都这样做,那么最好在将这些值传递给您的模板之前对其进行清理。

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

{% macro link(url) %}
<a href="{{ url }}">{{ url | remove_trailing_slash }}</a>
{% endmacro %}
于 2013-08-27T05:15:02.240 回答