• 2018-07-31
ウズマスター戦記
ウズマスター戦記 https://www.uzumax.org/2018/07/django-verbatim.html

Djangoのテンプレートタグ 「verbatim」 ブロック内の解釈を停止

日本一平凡なDjangoバナー

タグ「verbatim」は、「Djangoのテンプレートタグ 「templatetag」 テンプレートタグ自身を出力」で登場したタグ「templatetag」と同じく、メタ的なものです。

「{{」とか「{%」ようなDjangoのテンプレートレンダリングにおいて特殊な意味を持つ文字をそのまま出力したい時、タグ「verbatim」で括ることで「その範囲はテンプレートタグ」もしくは「テンプレートフィルタ」として解釈しない、という機能を持ちます。

どういう時に使うのか?

公式サイトによると、タグ「verbatim」は、 JavaScript テンプレート の文法が Django と衝突してしまう時によく使うとのことです。

で、試しにやってみたのですが、何も起きませんな……。

問題が起きない場合

少々試してみましたが、普通にJavaScriptを書いているだけだと何も起きないと思いますよ。

<script>
    function uzu(){
        alert("あひゃ~");
    }
</script>

「function uzu(){」は別にDjangoのテンプレートとして問題視されず、普通に出力可能です。
なら、どういう時に問題が起きるのか?

JsRenderなら問題が起きる

そこでふと、昔使ったJsRenderを思い出しました。

JsRenderはJavaScriptベースのテンプレートエンジンで、HTMLにはテンプレートタグを書いておいて、Webページのオンロード時にJsRenderを作動させることで表示をレンダリングするというライブラリです。
全域がJsRenderではなくても、一部分だけをAjaxでレンダリングする時に使うこともあります。

JsRenderの場合、HTMLには以下のような書き方をします。

<div>
   <em>Name:</em> {{:name}}
   {{if showNickname && nickname}}
      (Goes by <em>{{:nickname}}</em>)
   {{/if}}
</div>

「{{:name}}」とか、マズ~いタグが出てきていますね。

こんな状態で画面を表示すると……。


出ました。エラーです!!
これでピンと来ました。

確かに公式サイトの言う通り「JavaScript テンプレート の文法が Django と衝突してしまう時によく使う」ですね。

JavaScriptと衝突するんじゃなくて、JsRenderみたいなJavaScriptベースのテンプレートエンジンを使うときに衝突するって意味なんだ。

分かれば簡単な話でした。

使い方

以下のように単純に「verbatim」で括ってやればOKです。

テンプレート

{% verbatim %}
<div>
   <em>Name:</em> {{:name}}
   {{if showNickname && nickname}}
      (Goes by <em>{{:nickname}}</em>)
   {{/if}}
</div>
{% endverbatim %}

HTML出力

<div>
   <em>Name:</em> {{:name}}
   {{if showNickname && nickname}}
      (Goes by <em>{{:nickname}}</em>)
   {{/if}}
</div>


予定どおりDjangoとしてはレンダリングしないでそのままHTML出力されましたね。
後はこの先でJsRenderが実行すれば、JsRenderベースで出力されることになります。

verbatimの中にverbatim

こんなシチュエーションあるのかな?
verbatimで括った中で更にverbatimを書かねばならない時は、Djangoとして実行する方のverbatimに名前を付けて分かるようする必要があるとのことです。

{% verbatim myblock %}
    滅多にこんな使い方は {% verbatim %}{% endverbatim %} しないと思いますが。
{% endverbatim myblock %}

出展

公式サイトはこちら。


バックナンバー

0 件のコメント:

コメントを投稿

お気軽にコメント下さい。