Jinja 2:转义和扩展
Jinja 2 : escaping and extending
我试图在 运行 通过 Jinja2 然后通过 Django 设置我的模板后输出 html。 {{ 'RAW' }}
和 {% raw %}...{% endraw %}
标签没有按照我的预期进行,并且没有很多关于此的文档,我的谷歌搜索也没有任何帮助。
例如考虑以下一系列模板。第一个是想要扩展的股票 Jinja2 基页。
{# 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 %}
第二个是想要扩展的常用 Django 模板页面。
{# 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 mixin 模板,内容如下。这个想法是 运行 先通过 Jinja 然后通过 Django。
{# 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 运行 之后,我期待以下输出
{% 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 %}
但是,我得到的是以下内容。
{% extends "jinja_base.html" %}
MIXIN HEAD
MIXIN BODY
JINJA FOOT
这就是嵌入在 Jinja 转义序列中的所有 Django 代码都被剥离了。然而第一个标签被保留。
文档提到 extends
之前的所有内容都保持原样,但之后的所有内容都没有。没有解释如何最好地避免这种情况,也没有解释为什么这会影响 raw
/转义代码。
嗯..也许我必须把扩展放在最后?
扩展模板后,您必须将内容放在块之间。所有其他的东西都被忽略了。所以在 mixin.html
:
{{ '{% block django_head %}' }} <--- ignored
{% block jinja_head %}
MIXIN HEAD
{% endblock jinja_head %}
{{ '{% endblock django_head %}' }} <--- ignored
第一行和最后一行在 jinja_head
块之外,因此将被忽略。
正确的方法很简单,只需将 Django 行放在 Jinja 的块之间,例如:
{% block jinja_head %}
{{ '{% block django_head %}' }}
MIXIN HEAD
{{ '{% endblock django_head %}' }}
{% endblock jinja_head %}
结果:
{% block django_head %}
MIXIN HEAD
{% endblock django_head %}
对于 {{ '{% extends "django_base.html" %}' }}
只需在 jinja_base.html
中定义一个空块,您可以在 mixin.html
中使用 Django extends 行覆盖它。完整示例:
jinja_base.html
{# 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
{# 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 的渲染后看到预期的结果:
{% 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 %}
我试图在 运行 通过 Jinja2 然后通过 Django 设置我的模板后输出 html。 {{ 'RAW' }}
和 {% raw %}...{% endraw %}
标签没有按照我的预期进行,并且没有很多关于此的文档,我的谷歌搜索也没有任何帮助。
例如考虑以下一系列模板。第一个是想要扩展的股票 Jinja2 基页。
{# 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 %}
第二个是想要扩展的常用 Django 模板页面。
{# 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 mixin 模板,内容如下。这个想法是 运行 先通过 Jinja 然后通过 Django。
{# 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 运行 之后,我期待以下输出
{% 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 %}
但是,我得到的是以下内容。
{% extends "jinja_base.html" %}
MIXIN HEAD
MIXIN BODY
JINJA FOOT
这就是嵌入在 Jinja 转义序列中的所有 Django 代码都被剥离了。然而第一个标签被保留。
文档提到 extends
之前的所有内容都保持原样,但之后的所有内容都没有。没有解释如何最好地避免这种情况,也没有解释为什么这会影响 raw
/转义代码。
嗯..也许我必须把扩展放在最后?
扩展模板后,您必须将内容放在块之间。所有其他的东西都被忽略了。所以在 mixin.html
:
{{ '{% block django_head %}' }} <--- ignored
{% block jinja_head %}
MIXIN HEAD
{% endblock jinja_head %}
{{ '{% endblock django_head %}' }} <--- ignored
第一行和最后一行在 jinja_head
块之外,因此将被忽略。
正确的方法很简单,只需将 Django 行放在 Jinja 的块之间,例如:
{% block jinja_head %}
{{ '{% block django_head %}' }}
MIXIN HEAD
{{ '{% endblock django_head %}' }}
{% endblock jinja_head %}
结果:
{% block django_head %}
MIXIN HEAD
{% endblock django_head %}
对于 {{ '{% extends "django_base.html" %}' }}
只需在 jinja_base.html
中定义一个空块,您可以在 mixin.html
中使用 Django extends 行覆盖它。完整示例:
jinja_base.html
{# 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
{# 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 的渲染后看到预期的结果:
{% 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 %}