1
重複した投票を防ぐために、各投稿のユーザーの投票を保存します。アイデアは、 'faved_eintraege'にアップフォースを保存することです。ユーザーはインデックスページではなく、結果ページでのみ投票することができます。したがって、結果ビューに追加しました。重複防止の問題を解決する際にインデックスから投稿へのリダイレクトが失敗する
現在、あなたが投稿をアップヴォートすると、ポイントは上がりますが、インデックスページをクリックした投稿に関係なく、この(アップアップされた)投稿にリダイレクトされ続けるという問題はありません。ただし、重複投票はelse節に移動し、投票の三角形を表示しないため、重複投票は不可能です。だから、重複投票の防止が働く。
views.py
def result(request, id):
eintrag = get_object_or_404(Eintrag, pk=id)
...
eintraege = Eintrag.objects.all().order_by('-id')
if request.user.is_authenticated():
#here in the next line is the problem:
liked_eintraege = request.user.liked_eintraege.filter(id__in=[eintrag.id for eintrag in eintraege])
else:
liked_eintraege=[]
context = {
'eintrag': eintrag,
'comments': comments,
'comment_form':form,
'liked_eintraege': liked_eintraege
}
return render(request, 'gaestebuch/result.html', context)
@login_required
def vote(request):
eintrag = get_object_or_404(Eintrag, pk=request.POST.get('eintrag'))
eintrag.points += 1
eintrag.save()
user = request.user
user.liked_eintraege.add(eintrag)
user.save()
return HttpResponse()
models.py:
class Eintrag(models.Model):
author = models.ForeignKey(settings.AUTH_USER_MODEL, default=1)
title = models.CharField(max_length=200)
points = models.IntegerField(default=1)
text = models.TextField()
created_date = models.DateTimeField(default=timezone.now)
voters = models.ManyToManyField(User, related_name='liked_eintraege')
とresult.htmlで:
{% if user.is_authenticated and eintrag not in liked_eintraege %}
<a href="/vote/" id="eintrag-vote-{{ eintrag.id }}" class="vote">▲</a>
<p id="eintrag-title-{{ eintrag.id }}">{{ eintrag.title }}</p>
{% else %}
<p>{{ eintrag.title }}</p>
{% endif %}
投票機能が働き、前回の記事のおかげで私はすでにした。
何が問題なのですか? – C14L
Eintragモデルでブールフィールドを試したことがありますか?ユーザーが最初の投票をしたときにtrueに更新され、再度投票できなくなりましたか? – jsanchezs
もし私が間違っていたら私を訂正してください。しかし、あなたは単に「eintrag not in user.liked_eintrage'」をしていませんか? (または、それは 'user.liked_eintrage_set.all'です) - 私のポイントは' user.liked_eintrage'属性がすでに 'user'によってフィルタリングされているということです。 – rrauenza