【Django】viewsのデータをJavaScriptに渡すとエラーが出る原因と対処法

投稿日:

はじめに

Djangoのviews.pyからテンプレート(HTML)経由でJavaScriptにデータを渡す場面がありました。

ブラウザ上では正常に動いているのに、VS Code上では赤い波線だらけで、

  • cannot redeclare block-scoped variable

  • property assignment expected

といったエラーが表示される状態でした。

「動いてるから無視していいのかな……?」と思いつつも、毎回エディタで警告を見るのは地味にストレスです。

今回はこの問題について、

  • なぜエラーが出るのか

  • どう修正したのか

  • 最終的にどう書くのがよさそうか

をまとめます。


1. 最初の状態(エラーが出ていたコード)

Djangoのviews.pyからリスト形式のデータを渡し、テンプレート側でJavaScript変数に代入していました。

<script>
const labels = {{ labels|safe }};
const counts = {{ counts|safe }};
</script>

labelscountsは、例えば次のようなデータです。

  • labels: ["A", "B", "C"]

  • counts: [10, 20, 30]

ブラウザ上では問題なく動作しますが、VS Codeでは赤波線が出続けていました。

2. なぜエラーが出るのか

原因はシンプルで、VS Code(JavaScriptの解析機能)はDjangoのテンプレート構文を理解できないからです。

VS Codeから見ると、次のようなコードに見えています。

<script>
const labels = {{ labels|safe }};
const counts = {{ counts|safe }};
</script>

これはJavaScriptとしては存在しない構文なので、

  • {{ }} が意味不明

  • |safe がビット演算子のように解釈される

といった理由で、構文エラー扱いされてしまいます。

つまりこのエラーは、実行時エラーではなく、エディタの静的解析エラーでした。

3. 修正方法:json_scriptを使う

そこで使ったのが、Django公式で用意されている json_script フィルタです。

この方法では、

  • JavaScript(<script>タグ)の中に直接Django変数を書かない

  • JSONデータとしてHTMLに埋め込む

という形に変更します。

まず、データをJSONとして埋め込みます。(<script>タグの上に記載)

{{ labels|json_script:"labels-data" }}
{{ counts|json_script:"counts-data" }}

これにより、HTMLには「データ専用のscriptタグ」が生成されます。

続いて、同じHTMLファイル内のJavaScript部分で、そのJSONデータを取得します。

<script>
const labels = JSON.parse(
document.getElementById("labels-data").textContent
);
const counts = JSON.parse(
document.getElementById("counts-data").textContent
);
</script>

この形に修正した結果、

  • VS Codeの赤波線が消える

  • JavaScriptとして正しい構文になる

という状態になりました。

おわりに

今回の問題は、

  • Djangoとしては正しい

  • ブラウザでも動いている

  • でもエディタではエラーが出る

というものでした。

結論としては、

JavaScriptの中に直接Djangoテンプレート変数を書かない

という設計にするのが一番きれいでした。


記事一覧に戻る

関連記事

【Django】設定フォルダの名前を変える2つの方法(プロジェクト作成時・既存プロジェクト) プログラミング
【Django】設定フォルダの名前を変える2つの方法(プロジェクト作成時・既存プロジェクト)
【Django】おすすめのディレクトリ構成 プログラミング
【Django】おすすめのディレクトリ構成
【Django】context_processorsとは?全テンプレートに共通変数を渡す方法 プログラミング
【Django】context_processorsとは?全テンプレートに共通変数を渡す方法
サイトマップとは? - Djangoでサイトマップを自動で作成する方法 プログラミング
サイトマップとは? - Djangoでサイトマップを自動で作成する方法
Bootstrapでトーストを使う方法 ― ポップアップ通知の実装 プログラミング
Bootstrapでトーストを使う方法 ― ポップアップ通知の実装

人気記事

はじめまして その他
はじめまして
閲覧数: 1135
プログラミング初心者が独学で1からPythonを学習し、資格取得・webアプリ作成まで。(資格取得編) プログラミング
プログラミング初心者が独学で1からPythonを学習し、資格取得・webアプリ作成まで。(資格取得編)
閲覧数: 1118
VScodeでPython、HTML/CSSコードを自動で整形する方法 プログラミング
VScodeでPython、HTML/CSSコードを自動で整形する方法
閲覧数: 556
【Django】おすすめのディレクトリ構成 プログラミング
【Django】おすすめのディレクトリ構成
閲覧数: 543
X(旧Twitter)カードを正しく表示するためのHTMLの書き方 プログラミング
X(旧Twitter)カードを正しく表示するためのHTMLの書き方
閲覧数: 451

おすすめ記事

プログラミング初心者が独学で1からPythonを学習し、資格取得・webアプリ作成まで。(資格取得編) プログラミング
プログラミング初心者が独学で1からPythonを学習し、資格取得・webアプリ作成まで。(資格取得編)
VScodeでPython、HTML/CSSコードを自動で整形する方法 プログラミング
VScodeでPython、HTML/CSSコードを自動で整形する方法
複数ページの重複モデルを整理して保守性・拡張性を上げる プログラミング
複数ページの重複モデルを整理して保守性・拡張性を上げる
サイトマップとは? - Djangoでサイトマップを自動で作成する方法 プログラミング
サイトマップとは? - Djangoでサイトマップを自動で作成する方法
【Django】context_processorsとは?全テンプレートに共通変数を渡す方法 プログラミング
【Django】context_processorsとは?全テンプレートに共通変数を渡す方法

記事へコメントする

コメント一覧(0件)

関連記事

【Django】設定フォルダの名前を変える2つの方法(プロジェクト作成時・既存プロジェクト) プログラミング
【Django】設定フォルダの名前を変える2つの方法(プロジェクト作成時・既存プロジェクト)
【Django】おすすめのディレクトリ構成 プログラミング
【Django】おすすめのディレクトリ構成
【Django】context_processorsとは?全テンプレートに共通変数を渡す方法 プログラミング
【Django】context_processorsとは?全テンプレートに共通変数を渡す方法
サイトマップとは? - Djangoでサイトマップを自動で作成する方法 プログラミング
サイトマップとは? - Djangoでサイトマップを自動で作成する方法
Bootstrapでトーストを使う方法 ― ポップアップ通知の実装 プログラミング
Bootstrapでトーストを使う方法 ― ポップアップ通知の実装

人気記事

はじめまして その他
はじめまして
閲覧数: 1135
プログラミング初心者が独学で1からPythonを学習し、資格取得・webアプリ作成まで。(資格取得編) プログラミング
プログラミング初心者が独学で1からPythonを学習し、資格取得・webアプリ作成まで。(資格取得編)
閲覧数: 1118
VScodeでPython、HTML/CSSコードを自動で整形する方法 プログラミング
VScodeでPython、HTML/CSSコードを自動で整形する方法
閲覧数: 556
【Django】おすすめのディレクトリ構成 プログラミング
【Django】おすすめのディレクトリ構成
閲覧数: 543
X(旧Twitter)カードを正しく表示するためのHTMLの書き方 プログラミング
X(旧Twitter)カードを正しく表示するためのHTMLの書き方
閲覧数: 451

おすすめ記事

プログラミング初心者が独学で1からPythonを学習し、資格取得・webアプリ作成まで。(資格取得編) プログラミング
プログラミング初心者が独学で1からPythonを学習し、資格取得・webアプリ作成まで。(資格取得編)
VScodeでPython、HTML/CSSコードを自動で整形する方法 プログラミング
VScodeでPython、HTML/CSSコードを自動で整形する方法
複数ページの重複モデルを整理して保守性・拡張性を上げる プログラミング
複数ページの重複モデルを整理して保守性・拡張性を上げる
サイトマップとは? - Djangoでサイトマップを自動で作成する方法 プログラミング
サイトマップとは? - Djangoでサイトマップを自動で作成する方法
【Django】context_processorsとは?全テンプレートに共通変数を渡す方法 プログラミング
【Django】context_processorsとは?全テンプレートに共通変数を渡す方法

記事へコメントする

コメント一覧(0件)

シェアする