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

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

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

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

JavaScript

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

HTML

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

Q&A

解決済

2回答

6275閲覧

DjangoからJSへの値の受け渡しについて

torutakakura

総合スコア6

Django

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

JavaScript

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

HTML

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

0グッド

2クリップ

投稿2021/05/26 13:09

DjangoからJSに値を受け渡したい

DjangoでHTMLに渡しているデータをJSでも同様に使いたいです。

python

1# view.py 2from django.views import generic 3from . import mixins 4from memorial_calendar.models import MemorialDay 5 6 7# Create your views here. 8class MemorialCalendar(mixins.MonthWithScheduleMixin, generic.TemplateView): 9 """スケジュール付きの月間カレンダーを表示するビュー""" 10 template_name = 'memorial_calendar/memorialcalendar.html' 11 model = MemorialDay 12 date_field = 'memorialdate' 13 14 def get_context_data(self, **kwargs): 15 context = super().get_context_data(**kwargs) 16 calendar_context = self.get_month_calendar() 17 context.update(calendar_context) 18 return context 19 20

returnしているcontextにはカレンダーに表示する日付とスケジュールが
格納されています。

HTML

1{% extends 'base.html' %} 2{% load static %} 3{% block content %} 4 5<!-- ここでカレンダーをクリックしたときにJavascriptのソースが呼ばれる --> 6 <script type="text/javascript" src="{% static 'memorial_calendar/js/click-calendar.js' %}"></script> 7 <link rel='stylesheet' href="{% static 'memorial_calendar/css/style.css' %}"> 8 <a href="{% url 'memorialcalendar' month_previous.year month_previous.month %}">前月</a> 9 {{ month_current | date:"Y年m月" }} 10 <a href="{% url 'memorialcalendar' month_next.year month_next.month %}">次月</a> 11 <table class="table"> 12 <thead> 13 <tr> 14 {% for w in week_names %} 15 <th>{{ w }}</th> 16 {% endfor %} 17 </tr> 18 19<!-- 省略​--> 20

javascript

1 2// 下記でどうにかしてpythonで作成したcontextを受け取りたい 3var context = ?????????

流れとしてはDjango→HTML→JSになるような気がするのですが、どのように値を渡せばよいかわからずにいます。
簡単な文字列や数字ならidで付与して(たぶんあんまりよくない)、JSで使えばいいと思うのですが、オブジェクトだとどのように取得すればよいかわからないです。

Django初心者のため、詳しく教えていただけるうれしいです。

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

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

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

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

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

guest

回答2

0

ベストアンサー

おはようございます。

問題文読ませていただきました。

どこまでうまくいっているのか、わからなかったので、以下の手順を試してみてどこで詰まるか教えていただきますか?????‍♂️

  1. こちらの記事を熟読する。
  2. こちらの記事にあるように、htmlに<script src="{% static 'javascript/sample.js' %}"></script>を追加、sample.jsファイルを作成する。
  3. developer toolsを開く。
  4. consoleタブへ移動する。
  5. リロードしてsample.jsファイルに記載したconsole.log("書き換えテスト") が表示されているのか確認する。
  6. こちらの記事のベストアンサーを読んでfetchを活用する。

ご確認のほど、よろしくお願いいたします。????‍♂️

投稿2021/05/26 21:22

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

torutakakura

2021/05/27 14:09

ご回答いただき、ありがとうございます。 5,リロードしてsample.jsファイルに記載したconsole.log("書き換えテスト") が表示されているのか確認する。 →ここまでは確認できています。 6,こちらの記事のベストアンサーを読んでfetchを活用する。 →こちらを試しましたが、contextにはDBから取得したテーブルデータが入っており、以下のような  Djangoのエラーになりました。 >>> Object of type MemorialCalendar is not JSON serializable >>> 1,一度、テーブルデータを辞書型に変換して渡すべきなのでしょうか? 2、もしJsonResponseでデータ取得できた場合、JSで記載しなおす必要があるのでしょうか?  HTML内で使用している{{hogehoge}}{% if hoge %}などの記載も  JsonResponseで返却した場合、使用できなくなるような気がします。 3,また懸念点としてカレンダーを表示するため、URLが動的に変更されます。  教えていただいたベストアンサーでは、URLは固定されており毎回同じデータを取得しています。  その部分の記載もどうすれば、迷っています。
退会済みユーザー

退会済みユーザー

2021/05/27 22:36 編集

エラーは出ていますが、fetchを使えるところまでは理解できた感じですね。あとは、fetch内にdjangoで取得しているパラメータをbody要素に格納して渡すこと、jsを活用してbuttonクリックなどのイベントを用意してあげるとうまくいきますね。以下の記事を参考ください。 https://stackoverflow.com/questions/61543829/django-taking-values-from-post-request-javascript-fetch-api https://www.javadrive.jp/javascript/event/index2.html 1~3の質問に関しては、当初の目的(DjangoからJSへの値の受け渡しについて )とは外れると思いますので、今は考えないことにします。
torutakakura

2021/05/30 12:17

・fetchを使えるところまでは理解できた感じですね。あとは、fetch内にdjangoで取得しているパラメータをbody要素に格納して渡すこと →body要素に格納する際に、以下のように行おうとしましたが  エラーとなり、うまくいきませんでした。 >>>views.py self.request.body = context return context >>> contextには{日付型:<Memorialay>,日付型:<Memorialay>,日付型:<Memorialay>,}といった形の値が入っています。※Memorialayはテーブルから取得したpythonオブジェクトになります。 >>>エラー内容 can't set attribute >>> すみません、自分の勉強不足でcontextをどのように渡せば良いかわかっていないです。 body要素に格納するとは、以下のようなことですよね? self.request.body = context このように格納してfetchAPIを使用して取得するものだと思っています。認識あっていますでしょうか? ・jsを活用してbuttonクリックなどのイベントを用意してあげるとうまくいきますね。以下の記事を参考ください。 →クリックした際のイベントは取得することは確認できました。
退会済みユーザー

退会済みユーザー

2021/05/30 22:44 編集

うーん、、目的から外れてきている気がしますので、一度整理しましょう。 torutakakuraさんが実現したいことは以下の要項であっていますか? ・「DjangoでHTMLに渡しているデータをJSでも同様に使いたい」 → 自分はまず「jsからhtml要素を取得すること = DjangoでHTMLに渡しているデータを利用する」認識でして、jsのbuttonクリックなどの処理が実現できるのか確認させていただきました。 ・ただ、別の解釈として、js内でdjangoと通信して、データ取得したい可能性もあると考えておりまして、その場合のためにfetchの使い方をお伝えした次第です。 ↑ ここまでで認識ずれていたら教えてください。????‍♂️ 今悩んでいることとしては、 fetchは利用できるが、うまくjs→django→jsへ値渡しができないということで問題ありませんか?
torutakakura

2021/05/31 12:27

torutakakuraさんが実現したいことは以下の要項であっていますか? ・「DjangoでHTMLに渡しているデータをJSでも同様に使いたい」 → 自分はまず「jsからhtml要素を取得すること = DjangoでHTMLに渡しているデータを利用する」認識でして、jsのbuttonクリックなどの処理が実現できるのか確認させていただきました。 →上記の内容であっています。  Django からHTMLに渡しているcontextをJSで使えればそれでよいです。  ただクリックイベントからcontextをそのまま受け渡すのはデータ内容的に  難しいのでfetchAPIの使い方を教えていただいたと思っております。 <div id='{{ calendar_days}}' class='hogehoge'></div> 上記からidを取得することはできるが、日付型、pythonオブジェクトの型は維持されず、JSで forループなどの思ったコーディングができない。 ・ただ、別の解釈として、js内でdjangoと通信して、データ取得したい可能性もあると考えておりまして、その場合のためにfetchの使い方をお伝えした次第です。 →はい、そうです。 すみません、知識不足で質問があいまいになってしまってたと思います。 手段はどうあれ、views.pyでreturnしているcontextをJSで使えればよいのですが、、、 それは難しいでしょうか?
guest

0

DJangoのことはよくわかりませんが、どういう値をどう使いたいかによるのではないでしょうか。
jsファイルにはフレームワークのテンプレートの記述はできませんので、htmlにscriptタグ書くとか(エスケープは必須)、何かしらでHTMLに入れておいて(inputとかtextとかなんでも)何かしらのイベントトリガーで取得するとか、色々考えられなくもないです。

オブジェクトだと

HTML上に表示できるのは文字列もしくは文字列と解釈できるもの(数値など)だけなので、
JSONエンコードしておくのが良くあるやり方です。

投稿2021/05/26 14:05

編集2021/05/26 14:07
m.ts10806

総合スコア80850

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問