在 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) -}}
我期待这个宏
{% 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) -}}