【问题标题】:Jinja2 extends not working?Jinja2 扩展不起作用?
【发布时间】:2014-04-17 17:00:13
【问题描述】:

这是我的 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")

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

【问题讨论】:

    标签: pyramid jinja2 meta


    【解决方案1】:

    根据extends 上的Jinja2 documentation,“扩展标签可用于从另一个模板扩展模板。您可以在一个文件中包含多个模板只有一个其中可能会在当时被执行。”

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

    所以index.html 说使用base.html 作为骨架模板,但是用它自己的{% block body %} 替换父级(base.html) 中的{% block body %}

    在这条指令中(base.htmlindex.html 和视图代码中都没有)没有提到 meta.html。模板引擎不会分析您目录结构中的所有模板以查看它如何插入内容。它只是使用您的显式指令。

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2020-06-30
      • 1970-01-01
      • 2014-11-30
      • 2014-02-20
      • 2019-03-21
      • 2011-08-18
      • 2012-03-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多