TL;博士
我所知道的任何模板语言中都不存在此功能。您的最佳选择是:
- 使用这个 SO question破解
- 编写您自己的模板标签(见下文)
编写自己的模板标签
我认为您在这里有几个选择,其中一些是我从这里得到的,尽管它们都不涉及模板系统的内置功能。基本上,这里的目标是让渲染输出包含要再次渲染的模板标签的内容。
在我看来,最简单的做法是使用templatetag
模板标签或编写自己的模板标签来做类似的事情并负责转义。
如果您可靠地渲染var1
第一个和var2
第二个:
<!DOCTYPE html>
<html>
{{ var1 }}
{% templatetag openblock %} if {{ var1 }} and var2 {% templatetag closeblock %}
<span>some text</span>
{% templatetag openblock %} endif {% templatetag closeblock %}
{% templatetag openvariable %} var2 {% templatetag closevariable %}
</html>
在第一次渲染时,你会得到:
<!DOCTYPE html>
<html>
{{ 3 }}
{% if 3 and var2 %}
<span>some text</span>
{% endif %}
{{ var2 }}
</html>
在第二次渲染时,这将产生您想要的输出。
显然,不断编写多层{% templatetag %}
将是一个巨大的痛苦,所以我建议编写你自己的递归模板标签,它会为你处理这个问题,可能有一个参数来指定你需要多少层嵌套,然后显然是输入本身的参数。这样做的好处是,如果你只需要一层嵌套,让模板标签简单地输出输入就可以了,
基本上,通过递归地输出这个自定义模板标签,您可以很容易地实现所需的嵌套层数。假设标签被实现为{% t <layers of nesting> <input> %}
:
初始模板:{% t 2 "{{ var2 }}" %}
第一次渲染:{% t 1 "{{ var2 }}" %}
第二次渲染:{{ var2 }}
最终渲染:5
现在,对于一些更复杂的标签来说,这将更加困难,例如{% if %}
,当然,特别是如果像在您的示例中一样,您在单个 if 语句中需要多层渲染。您可能最好在这里拆分您的 if 语句,以便您可以进行更清晰的渲染分离。下面的例子假设一个{% t %}
标签的实现,它是一个{% t %}
/{% endt %}
组合:
初始 HTML:
{% if var1 %}
{% t 1 %}
{% if var2 %}
<span>some text</span>
{% endif %}
{% endt %}
{% endif %}
第一次渲染:
{# Note that the first if statement has been evaluated and is gone #}
{% if var2 %}
<span>some text</span>
{% endif %}
最终渲染:
<span>some text</span>