私はDjango Webアプリケーションを作成していますが、このWebサイトに似ている投票システムがあります。jQueryを入手できませんAjax submit form with Django
現在、upvoteまたはdownvoteの矢印をクリックすると、jQueryを使用して色の変化と投票スコア(投票数)の変化を処理します。私は基本的に、元々データベースから取り出された投票スコアを取ってそれに応じて1つを追加または削除し、この数字を表示します。私はデータベースから得点を更新していないので、投票はユーザーに一貫しているように見える(ユーザーがサイトにいる間に他の人が投票をした場合)。
私はajaxの部分に問題があります。基本的に、ユーザーが投票すると、私はまだupvoteまたはdownvoteの送信をサーバーに送信し、データベースを更新したいが、ページを更新する必要はない。 Ajax呼び出しの最後に "return false"を追加しないと、データベースが更新されますが、ページが更新されます。しかし、Ajax呼び出しの最後に "return false"を追加すると、私のページはリフレッシュされませんが、データベースも更新されません。
<form method="post" class="voting-button" action="/sentence/vote/{{sentence.id}}/">
{% csrf_token %}
<input type="submit" class="upvote_on" name="upvote" value="" />
<p class="vote-score">{{sentence.total_votes}}</p>
<input type="submit" class="downvote_off" name="downvote" value="" />
</form>
これは、2つのボタンを提出すると、フォームです::upvote用とdownvoteのための1
は、ここに私のフォームです。ここで
はあなたがupvoteボタンをクリックしたときのためのjavascriptです:
<script type="text/javascript">
//script to control arrows and the number of votes shown
$("[name='upvote']").click(function(){
if ($(this).attr("class") == "upvote_off") {
$(this).attr("class", "upvote_on");
//If upvote is off and downvote is off
if ($(this).siblings("[name='downvote']").attr("class") == "downvote_off"){
var score = $(this).siblings(".vote-score").text();
scoreInt = parseInt(score)
scoreInt += 1;
$(this).siblings(".vote-score").text(scoreInt);
} else { //if upvote is off and downvote is on
var score = $(this).siblings(".vote-score").text();
scoreInt = parseInt(score)
scoreInt += 2;
$(this).siblings(".vote-score").text(scoreInt);
}
$(this).siblings("[name='downvote']").attr("class", "downvote_off");
} else {
$(this).attr("class", "upvote_off");
$(this).siblings("[name='downvote']").attr("class", "downvote_off");
var score = $(this).siblings(".vote-score").text();
scoreInt = parseInt(score)
scoreInt -= 1;
$(this).siblings(".vote-score").text(scoreInt);
}
$.post(
'/sentence/vote/{{sentence.id}}/',
{
name: "upvote",
},
function(response){
$("#divText").text("hello world!");
}
)
})
基本的には、それの要旨はupvoteボタンが二つのクラスの1持つことができるということです。「uvpote_off」または「upvote_on」を、ユーザーがアップvしたかどうかによって異なります。 if elseステートメントは、これらのステートが正しく変更されただけです。問題はここにあるされ、正確に何
def vote(request, sentence_id):
p = get_object_or_404(Sentence, pk=sentence_id)
if 'upvote' in request.POST:
try:
v = Vote.objects.filter(voter = request.user).get(sentence=p)
if v.score == 0:
v.score = 1
elif v.score == 1:
v.score = 0
else: #for case where v.score = -1
v.score = 1
v.save()
except Vote.DoesNotExist:
v = Vote(voter =request.user, sentence=p, score=1)
v.save()
elif 'downvote' in request.POST:
try:
v = Vote.objects.filter(voter = request.user).get(sentence=p)
if v.score == 0:
v.score = -1
elif v.score == -1:
v.score = 0
else: #for case where v.score = 1
v.score = -1
v.save()
except Vote.DoesNotExist:
v = Vote(voter = request.user, sentence=p, score=1)
v.save()
return HttpResponseRedirect(reverse('sentence.views.show_sentence_order', args=(p.sentence_order,)))
:
ここでは、フォームが送信さに私のDjangoのビュー関数は、ありますか?私はここ数時間、この問題に苦労していて、チュートリアルをたくさん見ましたが、私が間違っていることを理解することはできません。
ご協力いただきありがとうございます。
こんにちはジェームズ、効率性についての指摘をありがとう。これは実際にDjangoアプリケーションを作成した初めてのコードなので、コードの効率的な設計はまだありません。チュートリアルは非常に面白かった、それは私がdjangoでajaxを設定することで持っていた多くの質問に答えました。主な問題は、実際には、csrf_tokenをPOSTデータとして渡すことでした:https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#ajax。私はそれをさらに精巧な答えとして掲示します。 – WarAndPiece
@WarAndPiece私の投稿が参考になった場合は、ありがとう、答えを受け入れて投票してください。 –