🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Django

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

JSON

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

JavaScript

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

2845閲覧

pythonからHTML/javascriptにjsonデータを送信したい。

yamatar

総合スコア4

Django

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

JSON

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

JavaScript

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2020/08/21 07:47

前提・実現したいこと

djangoでwebアプリを作ろうとしており、色々調べたのですがよく分からなかったので
質問させていただきます。
pythonのviews.pyで画像一覧のjsonデータを作ることは出来たのですが、
そのデータがHTML/javascriptに送れません。
プログラミングの分かる人が周りに1人もおらず、困り果てておりますので、
何卒よろしくお願い致します。

該当のソースコード

python

1#views.py 2import glob 3import os 4 5def file_load(request): 6 files = glob.glob("/media/image/A/*.JPG") 7 8 lists = [] 9 dic = {} 10 i = 1 11 for file in files: 12 dic["key_"+str(i)] = os.path.basename(file) 13 lists.append(dic) 14 i += 1 15 16 # JSON形式へ変換 17 li = json.dumps(dic,ensure_ascii=False, indent=4) 18 #return(li) 19 return render(request,'/map/index.html',context=li)

views.pyの出力結果

json

1{ 2 "key_1": "A_0001.JPG", 3 "key_3": "A_0002.JPG", 4 "key_4": "A_0003.JPG", 5 "key_5": "A_0004.JPG", 6}

ファイル名は表示されず、空欄や{ だけになってしまう。

html

1index.html 2<script type="text/javascript"> 3 var area = "{{ li|safe }}"; 4 document.write('<h4>{{li.0}}</h4>'); 5 document.write('<h4>{{li.1}}</h4>'); 6 document.write('<h4>{{li.2}}</h4>'); 7 document.write('<h4>{{li.3}}</h4>'); 8</script>

画像は増えていくので、今後はループでA_0001.JPG~が表示できるようにしたい。

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

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

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

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

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

guest

回答1

0

ベストアンサー

contextは辞書型で渡す必要があります。

views.pyの

python

1return render(request,'/map/index.html',context=li)

python

1return render(request,'/map/index.html',context={'url_list':li})

にして、index.htmlの

javascript

1var area = "{{ li|safe }}";

javascript

1var area = "{{ url_list |safe }}";

にするとどうでしょうか?

投稿2020/08/21 08:07

llr114

総合スコア203

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

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

yamatar

2020/08/24 00:19

ご回答ありがとうございます。 url_listで実行しましたが、何も表示されませんでした。 何か根本的な間違いがあるのでしょうか?
llr114

2020/08/24 01:45

url_listで実行、とはどのような状態でしょうか? python manage.py runserverでサーバーを立ち上げて、ブラウザで表示させる等あると思いますが、いかがでしょうか? また、index.htmlに<p>test</p>などを追加した場合、その文字は表示されるのでしょうか? 確認をお願いします。
yamatar

2020/08/24 02:59

python manage.py runserverで実行しました。 ブラウザにindex.htmlで記述したタイトル名や地図などは表示されていますが、ファイル名だけが出力されていません。 なぜか、def file_loadをdef indexに変えて HTMLをdocument.write('<h4>'+area+'</h4>');にすると{}だけ表示されます。li.0…のままだと何も表示されない。 def file_loadのままdocument.write('<h4>'+area+'</h4>');だと、 何も表示されません。 urls.pyの修正も必要? urlpatterns = [ path('admin/', admin.site.urls), path('api/', include(router.urls)), path('accounts/', include('django.contrib.auth.urls')), path('', index, name='map_index'), path('map/geojson/', GeojsonView.as_view(), name='geojson_view'), ]
llr114

2020/08/24 03:25 編集

urls.pyに追記が必要だと思います。 表示させたいURLはなんでしょうか? 今だと path('', index, name='map_index'), となっているので、ホームにアクセスした際に、関数index()を呼ぶようになっています。 def indexだと挙動が変わるのはそのためです。 「document.write('<h4>'+area+'</h4>');にすると{}だけ表示されます。」 これに関しては、 また、<h4>{{li.0}}</h4>の件ですが、views.pyの dic["key_"+str(i)] = os.path.basename(file) で値が取れていない可能性があります。 上記のコードの下に print(os.path.basename(file)) を設置するなりして、本当に取得できているのか確認してください。 また、 <h4>{{li.0}}</h4> とありますが、liの横の0はキーでしょうか? views.pyでdic["key_"+str(i)]としているので、やるならばkey_0とかだと思うのですが、いかがでしょうか?
yamatar

2020/08/24 06:19 編集

表示させたいURLはなんでしょうか?: ホームにアクセスしたときに表示したいです。 path('', file_load, name='map_index2')だと何も表示されませんでした。 print(os.path.basename(file)) を設置するなりして、本当に取得できているのか確認してください。: どうやらfiles = glob.glob("/media/image/A/*.JPG")で取得できていないようです。とりあえずglob.glob("C:/Users/~/media/image/A/*.JPG")とすると取得できました。(pycharmのターミナルで確認。) from django.conf import settingsして (settings.BASE_DIR+"/media/~)とすると別のエラーが… しかし、ブラウザでは表示されておらず、microsoft edgeのdevtoolに”Invalid or unexpected token”のエラーがでています。 <script type="text/javascript"> var area = "{  ←"{の部分に赤下線があり×マークもある。 "key_1": "A_0001.JPG", … "key_5": "A_0005.JPG", }"; jsondumpが上手くできていないという事でしょうか? <h4>{{li.0}}</h4>: 0番目、1番目を指定したつもりでした。 ファイル名の読み込みでエラーが出ているため、key_0の結果は確認できていません。
llr114

2020/08/24 06:47

devtoolに”Invalid or unexpected token”のエラーがでています。 →var area = "{{ li|safe }}";のタイミングでエラーが出るということでしょうか? そもそもliにデータがあるのか確認するために、 views.pyの # JSON形式へ変換 li = json.dumps(dic,ensure_ascii=False, indent=4) 次にprint(li)で中身がちゃんとあるかみてみてください。 その次、htmlの var area = "{{ li|safe }}"; の前にconsole.log("{{ li|safe }}") を設置して中身が入っているか、エラーが起きないか確認してみてください。
yamatar

2020/08/24 07:10

var area = "{{ li|safe }}";のタイミングでエラーがでています。 print(li)は取得できています。 出力結果; { "key_1": "A_0001.JPG", "key_5": "A_0005.JPG", } console.log("{{ li|safe }}")では上記(print(li)と同じ)の中身は入っていますが、エラーがでています。 エラー; Uncaught SyntaxError: Invalid or unexpected token console.log("{  ← "{ を指してエラー発生 "key_1": "A_0001.JPG", … print(li)出力時には{の前に"なかったです。
llr114

2020/08/24 07:23

var area = JSON.parse('{{li | safe}}'); こちらでどうでしょうか?
yamatar

2020/08/24 07:46

今まさにJSON.parseを試していたところです! var area = JSON.parse("{\u000A \u0022key_1\u0022: \u0022A_0001.JPG/…とdevtoolの表示は変ですが、 document.write('<h4>'+area.key_1+'</h4>'); とするとブラウザに表示されました。 ※document.write('<h4>{{key_1}}</h4>');ではダメなようです。
llr114

2020/08/24 08:31

※document.write('<h4>{{key_1}}</h4>') についてですが、key_1はただのキーで変数ではないので、それだけ記述しても何も表示されません。 これで解決したでしょうか?
yamatar

2020/08/24 22:48

大変勉強になりました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問