2016-11-10 4 views
0

Jinja2からDjangoでテンプレートを実行した後にhtmlを出力しようとしています。 {{ 'RAW' }}{% raw %}...{% endraw %}のタグは、私が期待していることをしていないし、これに関する多くのドキュメンテーションも、私のグーグル・グリーディングが有用ではない。Jinja 2:エスケープと拡張

例として、次の一連のテンプレートを検討してください。 1つは、伸ばしたいストックジンジャー2の基本ページです。

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

2番目は、拡張したい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テンプレートがあります。その考え方は、最初はジンジャを介して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 %} 

この結果:{{ '{% extends "django_base.html" %}' }}については

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

がちょうど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 %} 
関連する問題