質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Q&A

解決済

1回答

3009閲覧

Django(2.1.3)でViewからテンプレートへ渡した変数をJavaScriptで利用する方法

segawan

総合スコア14

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

0グッド

0クリップ

投稿2018/12/10 12:34

#開発環境
Mac:Mojave 10.14.1
Python:3.6.5
Django:2.1.3

#Viewから渡した変数がTemplate上のscriptタグ内で展開できない
Djangoでは通常、Viewから渡された変数をテンプレートで展開する場合、

HTML

1<p>{{ context }}</p>

のように記述するかと思いますが、同様にscriptタグ内で展開しようと

HTML

1<p>{{ context }}</p> 2<script> 3var con = {{ context }} 4console.log(con) 5</script>

とすると、「Uncaught SyntaxError: Invalid or unexpected token」
とエラーが出てしまいます。

#知りたいこと

  1. Viewから渡された変数をJavaScriptで利用する場合、どのように取り扱うべきでしょうか。

  2. ただstringやintを渡す場合はカスタムデータ属性に埋め込むことで、面倒ながらJavaScriptでの利用はできると思いますが、ViewからTemplateへJSONデータを渡したい場合はどのようにすべきでしょうか。

よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

セキュリティ面( XSS 対策)を考慮して、 Django 2.1 から使える json_script フィルタを使うのがよいかと思います。

以下、 Django の公式ドキュメントの説明そのままですが、 {'hello': 'world'} という dict を格納した変数 value がテンプレートに渡されているものとします。それに対して次のように json_script フィルタを適用すると

text

1{{ value|json_script:"hello-data" }}

次のような HTML が生成されます。

html

1<script id="hello-data" type="application/json">{"hello": "world"}</script>

ですので、後は JavaScript 側で JSON.parse() を使ってこの中身を読み込めば OK です。

var value = JSON.parse(document.getElementById('hello-data').textContent);

json_script< > & 等をエスケープして自動で XSS 対策を行ってくれます。

公式ドキュメントの該当箇所もご覧になってみてください:

投稿2018/12/10 13:27

gh640

総合スコア1407

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

segawan

2018/12/10 14:09

該当ページのescapejsまでは読んでいたのですがなぜかjson_scriptの項を読みこぼしていました... 実際に試してみて解決できました。ご丁寧にご説明頂きありがとうございます。
gh640

2018/12/11 02:46

そうでしたか。ご解決されたとのことで、よかったです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問