2016-11-10 61 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 %}