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

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

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

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

JavaScript

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Python

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

Q&A

解決済

3回答

3984閲覧

djangoでのサイト内お気に入り機能の実装

774

総合スコア79

Django

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

JavaScript

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Python

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

0グッド

0クリップ

投稿2019/02/24 16:50

編集2019/02/25 06:03

今掲示板のアプリケーションを作っているのですが、サイト内のお気に入り機能の実装で悩んでいます。
django内のモデルを非同期通信(ajax)を行い更新させるにはどのように実現させればよろしいのでしょうか?

今現在会員向けの掲示板を作成しているのですが、実現したい処理があります。
「☆」のように置かれた図をクリックするとdjangoのmodelを更新するという処理です。

更新するmodelはユーザIDとスレッドのIDを外部キーとして持ち、「どのユーザーがどの記事をお気に入り登録したか」を管理するmodelとなります。
django内でajaxを使い非同期通信を行うサンプルコードはあったのですが、モデルを更新するような処理は探しても出てこなかったので.質問をさせていただきました。

ご存知の方がいましたら、ご教授お願い致します。

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

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

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

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

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

t_obara

2019/02/25 01:28

あまりにも範囲が大きすぎるので、もう少し質問範囲を狭めた方が回答が得られやすいかと思います。
774

2019/02/25 01:42

依頼ありがとうございます。 django内での非同期通信の実現と範囲を狭めさせていただきました。
m.ts10806

2019/02/25 02:49

djangoじゃなければできるという意味でしょうか。 単に非同期できればいいのでしたら、それこそdjango ajaxとかで調べればそれなりに実現性のあるコードや参考記事は出てくるものですが、それでは何が足りないのでしょうか? 「お気に入り機能」というのもそれだけでは実際どのように情報が流れていくものか伝わりませんので、具体的にご自身がされている設計部分をご提示ください。
774

2019/02/25 03:14

何度もありがとうございます。 実現させたい処理を具体的に書きました。 もしまだ不十分であれば、言ってくださると助かります。
guest

回答3

0

ベストアンサー

JqueryでModelを非同期に更新する方法を調べてみました。以下のURLが参考になるかなと

【DjangoでAjaxを使いModelを更新する方法】
https://stackoverflow.com/questions/38855543/update-database-using-ajax-in-django

Djangoは日本語情報が少ないため、「お気に入り機能をAjaxで実装」といった細かい内容のサンプルを探しても見つからないことが多いです。
日本語で実現したい方法がわからない場合、英語で調べてみると情報がすんなり見つかることがあります。

上記のModelを更新する方法の処理を理解すれば、実現できるのではないでしょうか。

投稿2019/02/26 05:22

alpaka

総合スコア170

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

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

0

774さんの質問が少し概要的なので、
状況が以下のようであると類推してサンプルコードを記述しました。

1.django上に登録したモデルにフィールドとして、お気に入りのページを保持できるようにしたい。
2.Update処理をモデルの変化として認識している。
3.ajax通信でデータベースへの変更の手段が分からず困っている。

上記を前提として、まず3番ですが
ajaxでの通信自体はjqueryで行えるということですので、
django rest_frameworkを使用することをお勧めします。
rest_frameworkはdjango内のアプリとapi通信ができるようにするものなので、
こちらの使い方についてはご自身で調べてみてください。

お話しから774さんのモデルは最低限下記のように定義されていると推測いたしました。

python

1class Profile(models.Model): 2 user = models.OneToOneField(settings.AUTH_USER_MODEL) 3 favorite = models.ManyToManyField(Thread,blank=True,null=True) 4 5class Thread(models.Model): 6 author = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE) 7 title = models.TextField() 8 #その他のコンテンツ

あとは、apiを通してrequestを送ったユーザーのUserProfieのfavorite_threadにスレッドを追加すれば、
目的が達成できると思います。

提示されている情報が少なく、状況が不透明ですのであくまで一例ですが下記のようにviewを作成するのはいかがでしょか?

python

1from rest_framework.decorators import api_view 2from rest_framework.response import Response 3 4@api_view() 5def toggle_favorite_thread(request,pk): 6 thread = get_object_or_404(Thread,pk=pk) 7 if thread in request.user.profile.favorite.all(): 8 request.user.profile.favorite.remove(thread): 9 return Response({"message":"removed"}) 10 else: 11 request.user.profile.favorite.add(thread): 12 return Response({"message":"added"})

あとは、jqueryのajaxのsuccess内にDOM操作の処理を記述すれば想定されている処理になるのではないかと思います。

投稿2019/02/25 06:46

編集2019/02/26 05:37
hpyth

総合スコア12

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

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

0

基本的にプログラムって手続きなので順番に処理が流れていきます。
つまり、お気に入りに登録する処理「☆」のように置かれた図をクリックすると「★」と変化する処理は全く別物です。

手続き的には下記です。
0. ☆をクリックしたらお気に入りに登録する処理を行う
0. ↑が成功したら☆を★に置き換える(変更するでも良い)

です。
☆や★がどう設置される想定なのか分かりませんが、
単なる文字列や画像の置き換えと同じレベルと考えます。

「いいね」を非同期でカウントアップするものも実は同じで、
いいね押して処理をして成功したときに総数をカウントしたものを返して、そこに書いてある数字と置き換えただけだったりします(簡易的なものだったら数字拾ってきて+1するだけのものある)

1つずつやっていきましょう。

投稿2019/02/25 04:36

m.ts10806

総合スコア80765

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

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

774

2019/02/25 06:04 編集

ご回答ありがとうございます。 画像を変化させる部分はjqueryを使って出来そうですが(サンプルはありました)djangoのモデルをどう変化させるかが分からなかったので質問させていただきました。 「画像を変化させる処理」と「モデルを変化させる処理」が違うのは認識しています。 一先ずは質問の仕方を変えましたので、恐れ入りますがご回答をお願い致します。
m.ts10806

2019/02/25 06:04

「モデルを変化させる」必要はどうしてあるのでしょうか。 MVCフレームワークにおける「モデル」のことでしたら、 基本はあくまでデータベースのデータのやり取り部分の処理を記述するだけのものだと思うので、「変化させる」という動詞とはつながらないのですが。
alpaka

2019/02/25 06:27

1.☆をクリックしたらお気に入りに登録する処理を行う ↑これをAjaxでページをリロードせずどう実現するかがわからないということですよね。 英語で探せば似たサンプルはあると思います。
m.ts10806

2019/02/25 06:29

「ajaxを使い非同期通信を行うサンプルコードはあった」とあるのでそこが理解できているものと思ってました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問