在 Jinja2 中导致白色 space 的宏?

Macro causing white space in Jinja2?

我期待这个宏

{% macro join_them(first) -%}
    {% set data = [] %}
    {% if first not in ["", None, "None"] %}
        {{ data.append(first) }}
    {% endif %}
    {% for arg in varargs %}
        {% if arg not in ["", None, "None"] %}
            {{ data.append(arg) }}
        {% endif %}
    {% endfor %}
    {{' '.join(data)}}
{%- endmacro %}

会渲染这个

<td> * {{ join_them(docs["Author"]["Name"].title, docs["Author"]["Name"].first, docs["Author"]["Name"].middle, docs["Author"]["Name"].last, docs["Author"]["Name"].suffix) }}</td>

正如这一行,不使用宏,

<td> * {{ ' '.join([docs["Author"]["Name"].title, docs["Author"]["Name"].first, docs["Author"]["Name"].middle, docs["Author"]["Name"].last, docs["Author"]["Name"].suffix])}}</td>

非宏版本工作正常,并正确输出名称信息,但宏版本输出白色 space 和一些“None”字符串。

例如


           <td> *

    None







        None




Computer Community
            *</td>
            <td>Computer   Community </td>

有人对我在这里遗漏的内容有任何建议吗?或者更好的方法来处理这个问题?我通常不在 Jinja2 中使用宏,但这似乎是一个绝佳的机会。

宏确实导致了那些空行,你已经有了正确的方法,你需要使用 whitespace control 来删除它们。您只将它们放在宏的开头和结尾,但请注意:

You can also strip whitespace in templates by hand. If you add a minus sign (-) to the start or end of a block, a comment, or a variable expression, the whitespaces before or after that block will be removed

来源:https://jinja.palletsprojects.com/en/3.1.x/templates/#whitespace-control,重点,我的

因此,对于宏中的每个块,您都必须重复此操作。更确切地说,您在这里可以做的是用减号框住宏中的任何块。

然后对于 None 出现,这是因为您正在使用表达式定界符 {{ ... }} 附加到您的数组,而您应该使用语句定界符 {% ... %}do,正如文档中所指出的那样

If the expression-statement extension is loaded, a tag called do is available that works exactly like the regular variable expression ({{ ... }}); except it doesn’t print anything. This can be used to modify lists

{% do navigation.append('a string') %}

来源:https://jinja.palletsprojects.com/en/3.1.x/templates/#expression-statement

因此,您的宏最终应如下所示:

{%- macro join_them() -%}
  {%- set data = [] -%}
  {%- for arg in varargs if arg not in ["", None, "None"] -%}
    {%- do data.append(arg) -%}
  {%- endfor -%}
  {{- ' '.join(data) -}}
{%- endmacro -%}

请注意,如果您没有加载 expression-statement 扩展,您也可以用 inline-if [=49= 替换 {% do ... %} 块]:

{{- '' if data.append(arg) -}}