首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Jinja 2:逃跑和扩展

Jinja 2:逃跑和扩展
EN

Stack Overflow用户
提问于 2016-11-10 15:13:17
回答 1查看 854关注 0票数 0

在通过Jinja2并随后通过Django运行模板之后,我尝试输出html。{{ 'RAW' }}{% raw %}...{% endraw %}标记没有做我当时期望的事情,而且在这方面没有太多的文档,我的googling也没有提供任何有用的信息。

作为一个例子,请考虑以下一系列模板。第一个是要扩展的股票Jinja2基页面。

代码语言:javascript
复制
{# jinja_base.html #}
{% block jinja_head %}
 JINJA HEAD
{% endblock jinja_head %}
{% block jinja_body %}
 JINJA BODY
{% endblock jinja_body %}
{% block jinja_foot %}
 JINJA FOOT
{% endblock jinja_foot %}

第二个是要扩展的stock模板页面。

代码语言:javascript
复制
{# django_base.html #}
{% block django_head %}
 DJANGO HEAD
{% endblock django_head %}
{% block django_body %}
 DJANGO BODY
{% endblock django_body %}
{% block django_foot %}
 DJANGO FOOT
{% endblock django_foot %}

为了扩展它们,我有一个Jinja/Django混合模板,如下所示。我们的想法是先通过Jinja,然后再经过Django。

代码语言:javascript
复制
{# mixin.html #}
{{ '{% extends "django_base.html" %}' }}
{% extends "jinja_base.html" %}
{{ '{% block django_head %}' }}
{% block jinja_head %}
 MIXIN HEAD
{% endblock jinja_head %}
{{ '{% endblock django_head %}' }}
{{ '{% block django_body %}' }}
{% block jinja_body %}
 MIXIN BODY
{% endblock jinja_body %}
{{ '{% endblock django_body %}' }}
{{ '{% block django_foot %}' }}
{% block jinja_foot %}
 JINJA FOOT
{% endblock jinja_foot %}
{{ '{% endblock django_foot %}' }}

在Jinja运行之后,我期待下面的输出

代码语言:javascript
复制
{% extends "django_base.html" %}
{% block django_head %}
 MIXIN HEAD
{% endblock django_head %}
{% block django_body %}
 MIXIN BODY
{% endblock django_body %}
{% block django_foot %}
 JINJA FOOT
{% endblock django_foot %}

然而,我得到的是以下内容。

代码语言:javascript
复制
{% extends "jinja_base.html" %}
 MIXIN HEAD
 MIXIN BODY
 JINJA FOOT

这就是嵌入在Jinja转义序列中的Django代码被删除的全部内容。但是,保留第一个标记。

文档提到,extends之前的任何内容都保持原样,但之后的所有内容都不是。对于如何最好地避免这种情况,以及这影响raw/escaped代码的原因,没有任何解释。

嗯..。也许我一定要把延长线放在尽头?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-12 15:42:06

在扩展模板之后,必须将内容放在块之间。其他的东西都被忽略了。所以在mixin.html

代码语言:javascript
复制
{{ '{% block django_head %}' }}   <--- ignored
{% block jinja_head %}
 MIXIN HEAD
{% endblock jinja_head %}
{{ '{% endblock django_head %}' }} <--- ignored

第一行和最后一行在jinja_head块之外,因此将被忽略。

正确的方法很简单,只需在Jinja的块之间放置Django线,例如:

代码语言:javascript
复制
{% block jinja_head %}
{{ '{% block django_head %}' }}
MIXIN HEAD
{{ '{% endblock django_head %}' }}
{% endblock jinja_head %}

这一结果是:

代码语言:javascript
复制
{% block django_head %} 
MIXIN HEAD 
{% endblock django_head %}

对于{{ '{% extends "django_base.html" %}' }},只需在jinja_base.html中定义一个空块,您可以在mixin.html中用Django扩展行覆盖该块。完整的例子:

jinja_base.html

代码语言:javascript
复制
{# jinja_base.html #}

{% block django_extends %}
{% endblock django_extends %}

{% block jinja_head %}
JINJA HEAD
{% endblock jinja_head %}

{% block jinja_body %}
JINJA BODY
{% endblock jinja_body %}

{% block jinja_foot %}
JINJA FOOT
{% endblock jinja_foot %}

mixin.html

代码语言:javascript
复制
{# mixin.html #}
{% extends "jinja_base.html" %}

{% block django_extends %}
{{ '{% extends "django_base.html" %}' }}
{% endblock django_extends %}

{% block jinja_head %}
{{ '{% block django_head %}' }}
MIXIN HEAD
{{ '{% endblock django_head %}' }}
{% endblock jinja_head %}

{% block jinja_body %}
{{ '{% block django_body %}' }}
 MIXIN BODY
{{ '{% endblock django_body %}' }}
{% endblock jinja_body %}

{% block jinja_foot %}
{{ '{% block django_foot %}' }}
 JINJA FOOT
{{ '{% endblock django_foot %}' }}
{% endblock jinja_foot %}

这样,您将在Jinja的呈现之后看到预期的结果:

代码语言:javascript
复制
{% extends "django_base.html" %}

{% block django_head %}
 MIXIN HEAD
{% endblock django_head %}

{% block django_body %}
 MIXIN BODY
{% endblock django_body %}

{% block django_foot %}
 JINJA FOOT
{% endblock django_foot %}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40530942

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档