胡子模板可以做模板扩展吗?

2024-06-17 12:47:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我对胡子不熟悉。

许多模板语言(例如,Django/Jinja)将允许您像这样扩展“父”模板。。。

基本.html

<html><head></head>
    <body>
    {% block content %}{% endblock %}
    </body>
</html>

frontpage.html

{% extends "base.html" %}
{% block content %}<h1>Foobar!</h1>{% endblock %}

呈现的frontpage.html

<html><head></head>
    <body>
    <h1>Foobar!</h1>
    </body>
</html>

我知道胡子的部分(例如,{{>content}}),但这些似乎只是包括

是否存在用于胡子的模板扩展?否则,是否至少有一些设计模式可以有效地将includes转换为等价的模板扩展。


Tags: django模板语言basehtmlbodycontentblock
3条回答

您可以使用包含HTML的变量。像{{{variable}}}这样的“三重胡子”将返回未转换的HTML。它与模板扩展不完全相同,但您可以呈现frontpage content.html,然后将其输出放入传递到base.htmlcontent变量中。

(我将-content添加到frontpage.html文件名中,希望这样的命名模式有助于保持文件名的可管理性。)

我最近发现自己也在同一条船上,除了我来自mako的背景。

Mustache不允许模板扩展/继承,但我知道有几个选项可供选择。

  1. 可以使用部分:

    {{>header}}
        Hello {{name}}
    {{>footer}}
    
  2. 可以将模板预处理函数插入需要从其他页面继承的每个模板的上下文中:

    {{#extendBase}}      
        Hello {{name}}
    {{/extendBase}} 
    

    哈希:

    {
       "name": "Walden",
       "extendBase": function() {
           return function(text) {
               return "<html><head></head>" + render(text) + "</body></html>"
           }
       }
    }
    
  3. 在控制器中的相关页面上预先添加并附加所需的HTML。

  4. 有一个布局模板ala:

    {{>header}}
        {{{body}}}
    {{>footer}}
    

    并在控制器中呈现主体,将其作为名为body的变量传递给布局模板。

  5. 在加载模板的代码中实现模板继承(pre-mustache)。

不过,我不会使用三重胡子,因为我不想让未转义的HTML出现在任何地方,在我看来这太冒险了。

如果有人能更好地解决这个问题,我也很乐意听到,因为我还没有在任何一个方向上冒险。

我在这里提出了胡子的规格:

https://github.com/mustache/spec/issues/38

目前mustache.java、hogan.js和phly_mustache支持模板继承。

相关问题 更多 >