Python 限制每个用户的投票django

Python 限制每个用户的投票django,python,django,ajax,Python,Django,Ajax,我有这个代码,可以让你投票给一篇文章,现在一个用户可以无限次投票,我想这样做,当人们第一次点击按钮时,它会得到一个值,然后减少一,依此类推 下面是article.html: <button id="vote">vote</button> <script src="https://code.jquery.com/jquery-3.5.1.min.js"></script> <script&

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

下面是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>

您需要有一个单独的模型来存储用户附带的投票信息。否则你就不知道是谁投了那篇文章的票。您可以尝试以下方法:

# 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."})
FYI:尽管
GET
请求会起作用,但我建议使用
POST
方法,因为根据:

使用GET的请求应该只检索数据


但很明显,这种方法会在数据库中发生变化。

您需要一个单独的模型来存储用户附带的投票信息。否则你就不知道是谁投了那篇文章的票。您可以尝试以下方法:

# 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."})
FYI:尽管
GET
请求会起作用,但我建议使用
POST
方法,因为根据:

使用GET的请求应该只检索数据


但很明显,这种方法将在数据库中改变。

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

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

我得到此错误类型错误:\u init\u()缺少1个必需的位置参数:“on\u delete”我得到此错误类型错误:\u init\u()缺少1个必需的位置参数:“on\u delete”