2016-11-10 73 views
0

我想通过Jinja2运行我的模板之后通过Django输出html。 {{ 'RAW' }}{% raw %}...{% endraw %}标签没有做到我期望的那样,并且没有很多关于此的文档,也不会对我的搜索结果产生任何帮助。Jinja 2:转义和延伸

举一个例子,考虑下面的一系列模板。第一个是需要扩展的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 %}' }} 

的神社运行后,我期待下面的输出

{% 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 /转义代码。

嗯..也许我必须把延伸权利在最后?

回答

1

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

{{ '{% block django_head %}' }} <--- ignored 
{% block jinja_head %} 
MIXIN HEAD 
{% endblock jinja_head %} 
{{ '{% endblock django_head %}' }} <--- ignored 

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

正确的方法很简单,只要把神社的块之间的Django的线路,如:

{% 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定义一个空块,其中您可以用Django延伸线覆盖mixin.html。完整的例子:

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 %} 

这样,您将看到神社的后预期的结果呈现:

{% 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 %}