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

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

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

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

2416閲覧

Javascriptで二重にクォーテーションマークを記述してもブラウザで認識されない理由?

donadona

総合スコア19

Django

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2019/01/15 03:57

前提・実現したいこと

JavascriptでDjangoのテンプレート制御文をHTML内に追記しようとしています。
正しく追記されているように見えるのですが、GoogleChromeで認識されないようで、その理由がわからず困っております。

発生している問題・エラーメッセージ

Javascript

var text = '<div id="add-text"><img src="{% static \'img/image.gif\' %}"></img></div>'; $("body").append(text);

この文字列を、console.logで出力したり、HTMLのソースコードを見ると、
意図したとおり
<div id="add-text"><img src="{% static 'img/image.gif' %}"></img></div>
と記述されています。

ところが、ブラウザの方では、

http://127.0.0.1:8000/appnaame/%7B%%20static%20'img/image.gif'%20%%7D not found

とエラーが出ていて、srcが正しく表示されません。
つまり、{%%}の部分が認識されずに、文字コードに置き換わって解釈されているようです。

エスケープすれば良いと考えていましたが、さらに何かしなければいけないのでしょうか?

補足情報(Django2.0, Python3.6, Windows10 VSCode, Chrome)

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

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

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

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

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

guest

回答2

0

JavascriptでDjangoのテンプレート制御文をHTML内に追記しようとしています。

Djangoを使った処理の流れは、「サーバサイドでDjangoの処理を行う」→「それをブラウザに転送する」→「ブラウザに送られたHTMLの上でJavaScriptが動く」となっています。

つまり、(ビューにJavaScriptを書いて事前にDjangoで処理させるという方法を取らない限り)JavaScript内にDjangoのテンプレートを書いても反映されません

投稿2019/01/15 04:00

maisumakun

総合スコア145184

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

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

donadona

2019/01/15 04:28

早急にご回答いただきありがとうございました。 制御文を解釈しているのはブラウザではなくDjango(Python)なので、言われてみればそうですね。 ということは、現在のアプリケーションのディレクトリからの相対パスで記述するのが良いでしょうか? (それでひとまずうまく行きました。)
guest

0

ベストアンサー

もしかして、外部JSファイルにこんな書き方してるんですか?
もしそうなら動くわけないでしょ!!

しかし、本文を読む限りだとHTMLのscriptタグ内に下記のようにべた書きしているように思えますね。
なので表示されないのはちょっと不可解ですね。

HTML

1<script> 2var text = '<div id="add-text"><img src="{% static \'img/image.gif\' %}"></img></div>'; 3$("body").append(text); 4</script>

Django staticファイル まとめ - Qiita
この記事を参考にすると、{% load static %}というおまじないがなければ使えなさそうというのと、
別にエスケープする必要はなさそうという感じですね。
この書き方を参考に編集してみては?

HTML

1{% load static %} 2<img src="{% static "myapp/image.jpg" %}" alt="My image"/>

投稿2019/01/15 04:15

miyabi-sun

総合スコア21158

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

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

donadona

2019/01/15 05:37 編集

ありがとうございました。 先程回答者様への私の返信ですが、スクリプトはページロード時に一度読み込んでいるので、その中でテンプレート制御文は使えましたね。 再訂正。 それで、ご提供いただいたコードでうまくいきました。 HTMLに記述するダブルクォーテーションの方は、二重になっても良いようです。 助かりました。
miyabi-sun

2019/01/15 05:43

あー、いまさらですが理由がわかりました。 Webサーバの実行順序は下記です。 (Pythonで作った)WebサーバがHTML文書作る →ChromeがHTTPリクエストを行いHTML文書をローカルに持ち帰る →scriptタグを見つけて実行 一見コードの外側からシングルクォート、ダブルクォートを併用していてエスケープするしかないように思えますが、 実際にはDjangoテンプレートの記述が真っ先に解釈されてきれいなHTML文書が生成されます。 なので質問文の位置でエスケープしたら動きませんよという話ですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問