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

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

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

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

teratail

teratail(テラテイル)は、プログラミングに特化した日本語Q&Aサイトです。

Python

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

Q&A

解決済

1回答

1626閲覧

teratailのGoodボタン

退会済みユーザー

退会済みユーザー

総合スコア0

Django

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

teratail

teratail(テラテイル)は、プログラミングに特化した日本語Q&Aサイトです。

Python

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

2グッド

3クリップ

投稿2016/02/23 14:16

Django(Python)で、teratailのような質問サイトを作成しています。

teratailには、各質問を評価するGoodボタンがあります。
これは、一度押したら、評価が+1となり、2回目押す時は評価が-1になります。
同じようなことをしたいのですが、どのようなロジックになっているのでしょうか。

私は、下記のような感じかと想像したのですが、こんな感じで作るしかないのでしょうか?
・各質問のテーブルに、Good評価したユーザーを保存するフィールド(以下、「goodフィールド」)がある。
・ユーザーが、ある質問を表示しようと呼び出したら、当該ユーザーが当該質問に対してGood評価しているユーザー一覧に含まれているかを判定する。未だGood評価していないユーザーには、Goodボタンを押すと評価が+1となるリンク付きのHtmlを送る。既にGood評価をしているユーザーには、Goodボタンを押すと評価が-1となるリンク付きのHtmlを送る。
・+1となるリンクを押したユーザーを、「Goodフィールド」に追加する。-1となるリンクを押したユーザーを、「Goodフィールド」から削除する。
・「Goodフィールド」に保存されているユーザー数をカウントして、Good評価しているユーザー数を集計し、Html上に表示する。

私は、当初、DjangoのチュートリアルのPollsにあったように作ろうと思ったのですが、これでは同一ユーザーが何回でも評価できてしまうので、どうしたらよいかと検討している次第です。
お分かりの方、どうぞよろしくお願いいたします。

nnahito, shimane👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

リンクやボタンの内容を変えるよりも、ボタンを押した時のアクションは一定にしてサーバ側で処理を分けたほうが楽な気がします。

  1. 「誰(usrid)」が「ボタンを押した」情報をサーバに送信
  2. サーバ側で「誰(usrid)」の評価履歴をチェック
  3. 新規ならIDとpoint=1を記録、既存ならpointの1,0を切り替える。
  4. 全ユーザの記録pointを合計してページに返信

[3]は新規ならidを記録、既存ならidを削除でもなんでも。
1,0の切り替えはifで分岐してもいいし、「(point+1)%2」のように1足して2で割った余り等

投稿2016/02/23 14:52

hirohiro

総合スコア2068

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

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

退会済みユーザー

退会済みユーザー

2016/02/23 23:29 編集

ご回答頂き、ありがとうございます。 確かに、ボタンを押した時のアクションはサーバー側で判断させた方がよいですね。 1と0を切り替えるということは、質問フィールド、ユーザーフィールド、評価フィールドの3つのフィールドがある評価テーブルを作るということですよね? 質問が一つ増える毎に、ユーザー数分のレコードができて、デフォルトで0が入るという感じでしょうか?ユーザーが一人増えただけでも、質問数分のレコードができて、デフォルトで0が入るということになりますよね。 質問テーブルに、「Goodフィールド」を設けて、そこにGood評価したユーザーを入れ、評価を下げたユーザーを削除するという方法と、どちらが良いのだろうかと思ったので、追加して質問させていただきました。
hirohiro

2016/02/24 09:00 編集

この場合はGOODを管理する専用テーブルで良いんじゃないでしょうか? 要素は質問記事ID,評価USERIDの2つです。 (質問投稿者IDと評価Pointがあってもいいです) 例えば私のIDが100、この質問のIDが50として、私がGOODをクリックすると 0.ページからAjaxで誰がどの質問のGOODを押したか通知 1.質問記事ID=50,評価USERID=100 のレコードがテーブルに存在するかどうか確認し 2-0.既に存在したならレコード削除 2.無ければ、USERID=100が質問記事投稿者で無いことを確認し 3.1,2が真なら質問記事ID=50,評価USERID=100を記録 4.質問記事ID=50のレコード数を数えてAjaxに返信 5.GOOD欄の表示を返信値で更新 ※0,5以外はサーバ処理 2の下りは質実穏当後者はGOODボタンが押せないページが表示されてるはずなので不要かも知れませんが、念のため。
退会済みユーザー

退会済みユーザー

2016/02/24 09:38

質問毎に、GOOD評価をした人のIDを保存しておくということですね。 頭が整理できました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問