[英]Django I want to limit user voting to once per 24 hours but I limited it per article and not per user
[英]Limiting voting per user django
我有这段代码可以让你为一篇文章投票,现在用户可以无限次投票,我想这样做,所以当人们第一次点击按钮时,它的值会减一,然后减一,依此类推。
这是文章。html:
<button id="vote">vote</button>
<script src="https://code.jquery.com/jquery-3.5.1.min.js"></script>
<script>
$("#vote").click(function (e) {
e.preventDefault()
var upvotes = $("#total_votes").html()
var updatedUpVotes = parseInt(upvotes) + 1
$("#total_votes").html(updatedUpVotes)
$.ajax({
url: 'vote/',
method: "GET",
data: {},
success: function (data) {
console.log(data)
},
error: function (error) {
console.log(error)
}
})
})
</script>
在views.py中投票function:
def vote(request, article_id):
article = get_object_or_404(Article, pk=article_id)
article.votes += 1
article.save()
return JsonResponse(data = {"vote": "Voted! Thank you for the vote."})
您需要有一个单独的 model 来存储用户附带的投票信息。 否则,您将不知道是谁投了那篇文章。 你可以尝试这样的事情:
# Model
class Vote(models.Model):
user = models.ForeignKey(User,on_delete=models.DO_NOTHING)
article = models.ForeignKey(Article,on_delete=models.DO_NOTHING)
# View
from django.contrib.auth.decorators import login_required
@login_required
def vote(request, article_id):
article = get_object_or_404(Article, pk=article_id)
vote, created = Vote.objects.get_or_create(article=article, user=request.user)
if created:
return JsonResponse(data = {"vote": "Voted! Thank you for the vote."})
return JsonResponse(data = {"vote": "You already voted for this article."})
仅供参考:即使GET
请求可以工作,但我建议使用POST
方法,因为根据MDN :
使用 GET 的请求应该只检索数据。
但显然这种方法会在数据库中改变。
创建一个单独的 model 将包含文章 ID 和用户 ID。 单击“赞”按钮时,检查该用户和文章是否存在数据。 如果存在,则将投票减 1,否则增加其值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.