1

我有这段代码可以让你为一篇文章投票,现在用户可以无限次投票,我想这样做,所以当人们第一次点击按钮时,它的值会减一,然后减一,依此类推。

这是article.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 中的投票功能:

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."})
4

2 回答 2

0

您需要有一个单独的模型来存储用户附加的投票信息。否则,您将不知道是谁投了那篇文章。你可以尝试这样的事情:

# 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 的请求应该只检索数据。

但显然这种方法会在数据库中改变。

于 2020-08-14T08:56:51.253 回答
0

创建一个包含文章 ID 和用户 ID 的单独模型。单击“赞”按钮时,检查该用户和文章是否存在数据。如果存在,则将投票减 1,否则增加其值。

于 2020-08-14T08:57:04.523 回答