Ограничение голосования для каждого пользователя 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>
        $("#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."})
  

Ответ №1:

Создайте отдельную модель, которая будет содержать идентификатор статьи и идентификатор пользователя. При нажатии на кнопку «Мне нравится» проверьте, существуют ли данные для этого пользователя и статьи. Если оно существует, уменьшите количество голосов на 1, иначе увеличьте его значение.

Ответ №2:

Вам нужна отдельная модель для хранения информации о голосовании, прикрепленной к пользователю. В противном случае вы не будете иметь ни малейшего представления, кто проголосовал за эту статью. Вы можете попробовать что-то вроде этого:

 # 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, должны извлекать только данные.

Но очевидно, что этот метод изменится в базе данных.

Комментарии:

1. Я получаю эту ошибку TypeError: __init__() отсутствует 1 требуемый позиционный аргумент: ‘on_delete’