Jinja2延伸不起作用?

时间:2014-04-17 17:00:13

标签: pyramid jinja2 meta

这是我的base.html:

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

这是我的meta.html:

{% extends 'templates/base.html' %}
{% block head %}

{% if page == 'index' %}
<meta name="mysite.com" content="{{page}}"></meta>
{% else %}
<meta name="mysite.com" content="other page"></meta>

{% endblock %}

这是我的index.html:

{% extends 'templates/base.html' %}

{% block body %}
......
{% endblock %}

这是我的观点:

@view_config(route_name='index', renderer='templates/index.html', permission='view')
def index(request):
    return dict(page="index")

扩展正文,但元标记根本没有显示。我做错了什么?

1 个答案:

答案 0 :(得分:5)

根据extends上的Jinja2 documentation,&#34; extends标记可用于从另一个扩展模板。您可以在文件中包含多个,但只有一个可以在时执行。&#34;

从视图中加载index.html时,模板引擎会评估index.html。它在{% extends 'templates/base.html' %}中看到index.html,并使用index.html中的块替换父/扩展模板(base.html)的同名块。

所以index.html表示要使用base.html作为框架模板,而是将父{% block body %}}中的base.html替换为自己的{% block body %}。< / p>

此指令中没有任何地方(base.htmlindex.html或视图代码)都没有提及meta.html。模板引擎不分析目录结构中的所有模板,以查看它如何插入内容。它只使用您的显式指令。

要明确使用meta.html,您可以使用include中的base.html指令(文档here)。您的base.html将如下所示:

<html>
    <head>
        {% include 'templates/meta.html' %}
        {% block head %}
        {% endblock %}
   </head>
    <body>
        {% block body %}
        {% endblock %}
    </body>
</html>

这将引入meta.html并将骨架的同名块(base.html)替换为从包含模板中检索到的块{{1} }})。

此外,meta.html中的extends语句需要删除,因此它不会创建循环模板包含。