有没有可以进行"部分渲染"的python模板库?

pri*_*stc 5 python template-engine

可以说我有以下模板:

<!DOCTYPE html>    
<html>
    {{ var1 }}
    {% if var1 and var2 %}
        <span>some text</span>
    {% endif %}
    {{ var2 }}
</html>
Run Code Online (Sandbox Code Playgroud)

当我var1=3像上下文一样呈现它时,它会产生以下输出:

<!DOCTYPE html>    
<html>
    3
    {% if 3 and var2 %}
        <span>some text</span>
    {% endif %}
    {{ var2 }}
</html>
Run Code Online (Sandbox Code Playgroud)

当我再次使用var2=5上下文渲染第一个渲染的输出时,输出为:

<!DOCTYPE html>    
<html>
    3
        <span>some text</span>
    5
</html>
Run Code Online (Sandbox Code Playgroud)

问题是大多数模板引擎会将上下文中缺失的变量评估为空字符串.这些都是在假设只有一个渲染的情况下构建的.

我知道jinja2可以用这种方法做到这一点:jinja2模板的多个渲染?

但它在整个if语句中不起作用,它只适用于单个变量.

是否有任何流行的模板库具有我描述的渲染模式?马可?元史?别的什么?也许这是一个非python模板引擎吗?

jdo*_*dot 5

TL; DR

我所知道的任何模板语言都不存在此功能。您最好的选择是:

  1. 乱搞这个问题
  2. 编写自己的模板标签(见下文)

编写自己的模板标签

我认为您在这里有几个选择,其中一些是我提供的 ,虽然模板系统的内置功能中这里。基本上,这里的目标是使渲染输出包含要再次渲染的模板标签的内容。

如我所见,最简单的方法是使用 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>
Run Code Online (Sandbox Code Playgroud)

第一次渲染时,您将获得:

<!DOCTYPE html>    
<html>
    {{ 3 }}
    {% if 3 and var2 %}
        <span>some text</span>
    {% endif %}
    {{ var2 }}
</html>
Run Code Online (Sandbox Code Playgroud)

在第二次渲染时,将产生所需的输出。

显然,不断编写多层 {% templatetag %}将是一个巨大的痛苦,所以我建议编写自己的递归模板标签来为您解决这个问题,可能带有一个参数,该参数指定您需要多少层嵌套,然后显然是输入本身的参数。这样做的好处是,如果您只需要一层嵌套,那么只需将template标签简单地输出输入即可,

基本上,通过递归输出此自定义模板标记,您可以轻松实现所需的多层嵌套。假设标签实现为{% 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 %}
Run Code Online (Sandbox Code Playgroud)

第一次渲染:

<!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>
Run Code Online (Sandbox Code Playgroud)

最终渲染:

<!DOCTYPE html>    
<html>
    {{ 3 }}
    {% if 3 and var2 %}
        <span>some text</span>
    {% endif %}
    {{ var2 }}
</html>
Run Code Online (Sandbox Code Playgroud)